Android Google Gson Beispiele und Tutorials._

Gson (auch bekannt als Google Gson) ist eine kleine Java-basierte Bibliothek zum Parsen und Erstellen von JSON-Objekten.

Es handelt sich um eine Serialisierungs-/Deserialisierungsbibliothek, die Java-Objekte in JSON und zurück konvertiert.

Google entwickelte Gson für seine eigenen Projekte, machte Gson aber später, beginnend mit Version 1.0, öffentlich verfügbar.

Gson ist sehr leistungsfähig und kann mit beliebigen Java-Objekten arbeiten, auch mit bereits existierenden Objekten, von denen Sie keinen Quellcode haben.

Verwendungen von Gson

  1. Konvertierung von Java-Objekten in JSON und zurück.
  2. Konvertierung eines JSON-Strings in ein entsprechendes Java-Objekt.

Warum wurde Gson geschaffen?

Hier sind die Gründe für die Erstellung von Gson:

  1. Um die Arbeit mit JSON einfach zu machen, indem man einfache toJson() und fromJson() Methoden bereitstellt. Diese Methoden ermöglichen es uns, Java-Objekte in JSON zu konvertieren und andersherum.
  2. Vorhandene, nicht veränderbare Objekte können in und aus JSON konvertiert werden.
  3. Umfassende Unterstützung von Java Generics zu bieten.
  4. Ermöglichung benutzerdefinierter Darstellungen für Objekte
  5. Unterstützung von beliebig komplexen Objekten (mit tiefen Vererbungshierarchien und umfangreicher Verwendung von generischen Typen)

Installation von Gson

Gson zielt auf Java-basierte Projekte ab, einschließlich android. Das bedeutet, dass wir mindestens mehrere Möglichkeiten haben, es abhängig von unserem Build-System zu installieren.

(a) Gradle

Wenn Sie z.B. android verwenden, dann benutzen Sie wahrscheinlich android studio und gradle.

In diesem Fall fügst du das Folgende in die Abhängigkeiten deiner App-Ebene build.gradle ein:

implementation 'com.google.code.gson:gson:2.8.5'

(b) Maven

Wenn Sie ein allgemeines Java-Projekt erstellen, dann werden Sie höchstwahrscheinlich Maven verwenden:

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.5</version>
</dependency>

(c) Jar

Die letzte Möglichkeit ist, jar direkt zu verwenden. Sie laden sie von Maven Central herunter und fügen sie Ihrem Projekt hinzu.

Download Jar hier.

Wichtige Klassen

(a) Gson

Gson" ist eine Klasse aus dem Paket "com.google.gson" und ist die Hauptklasse, die wir für die Verwendung der Gson-Bibliothek benötigen.

Normalerweise verwenden wir sie, indem wir zuerst eine Gson-Instanz konstruieren und dann die Methoden toJson(Object) oder fromJson(String, Class) auf ihr aufrufen.

(b). JsonElement

JsonElement" ist eine Klasse aus dem Paket "com.google.gson", die ein Json-Element darstellt.

Hier sind JsonElement-Objekte:

  1. JsonObject
  2. JsonArray
  3. JsonPrimitive
  4. JsonNull.
(c) JsonObject

JsonObject" ist eine Klasse aus dem Paket "com.google.gson", die einen Objekttyp in Json darstellt.

Dieses Objekt kann aus Name-Wert-Paaren bestehen, wobei Namen Strings und Werte jeder andere Typ von JsonElement sind.

Damit können wir dann einen Baum von JsonElementen aufbauen. Diese Elemente werden in der Reihenfolge, in der sie hinzugefügt wurden, verwaltet.

(d) JsonParser

JsonParser" ist eine Klasse aus dem Paket "com.google.gson", die zum Parsen von Json in einen Parse-Baum von JsonElementen verwendet wird.

Gson erstellen

1. Gson()

Die erste Möglichkeit, ein Gson-Objekt zu erstellen oder zu konstruieren, ist die Verwendung des Defalu-Konstruktors: "Gson()".

Dadurch wird ein Gson-Objekt mit einer Standardkonfiguration erstellt.

Diese Standardkonfiguration hat die folgenden Einstellungen:

  1. Das von den toJson-Methoden erzeugte JSON ist in kompakter Darstellung. Das bedeutet, dass der gesamte nicht benötigte Leerraum entfernt wird. Sie können dieses Verhalten mit GsonBuilder#setPrettyPrinting() ändern.
  2. Das generierte JSON lässt alle Felder aus, die null sind. Beachten Sie, dass Nullen in Arrays beibehalten werden, da ein Array eine geordnete Liste ist. Außerdem, wenn ein Feld nicht null ist, aber sein generiertes JSON leer ist, wird das Feld beibehalten. Sie können Gson so konfigurieren, dass Nullwerte serialisiert werden, indem Sie GsonBuilder#serializeNulls() setzen.
  3. Gson bietet Standard-Serialisierung und Deserialisierung für Enums, Map, java.net.URL, java.net.URI, java.util.Locale, java.util.Date, java.math.BigDecimal und java.math.BigInteger Klassen.
2. GsonBuilder

GsonBuilder kann verwendet werden, um Gson mit verschiedenen Konfigurationseinstellungen zu instanziieren.

Gson gson = new GsonBuilder().setPrettyPrinting().create();

GsonBuilder folgt dem Builder-Muster und wird typischerweise verwendet, indem zunächst verschiedene Konfigurationsmethoden aufgerufen werden, um die gewünschten Optionen zu setzen, und schließlich die Methode create() aufgerufen wird.

Wichtige Gson-Methoden

(a). toJson()

Diese Methode serialisiert das angegebene Objekt, einschließlich derjenigen von generischen Typen, in seine äquivalente Json-Darstellung.

Gson gson = new Gson();
gson.toJson(map);

Sie muss verwendet werden, wenn das angegebene Objekt ein generischer Typ ist. Für nicht-generische Objekte ist stattdessen toJson(Object,Appendable) zu verwenden.

(b). fromJson

Diese Methode deserialisiert das angegebene Json in ein Objekt des angegebenen Typs. Diese Methode ist nützlich, wenn das angegebene Objekt ein generischer Typ ist. Für nicht-generische Objekte, verwenden Sie stattdessen fromJson(String,Class).

Wenn Sie den Json in einem Reader statt in einem String haben, verwenden Sie stattdessen fromJson(Reader,Type).

(c). toJsonTree

Diese Methode serialisiert das angegebene Objekt, einschließlich generischer Typen, in seine äquivalente Darstellung als Baum von JsonElementen. Diese Methode muss verwendet werden, wenn das angegebene Objekt ein generischer Typ ist. Für nicht-generische Objekte, verwenden Sie stattdessen toJsonTree(Object).

(d). getAdapter

Gibt den Typadapter für type zurück.

Vollständiges Gson Hello World Beispiel

Schauen wir uns ein vollständiges Gson Hello World Beispiel an. Sie können dieses Beispiel in Ihre IDE kopieren, solange Sie Gson installiert haben und ausführen.

import com.google.gson.Gson;

/**
 *  Gson Hello World
 *
  */
public class GsonHelloWorld {

    public static void main(String[] args) {
        // init class
        Place place = new Place();
        place.setName("World");

        Human human = new Human();
        human.setMessage("Hi");
        human.setPlace(place);

        // convert to json
        Gson gson = new Gson();
        String jsonString = gson.toJson(human);
        System.out.println("json " + jsonString); // print "json {"message":"Hi","place":{"name":"World"}}"

        // convert from json
        Human newHuman = gson.fromJson(jsonString, Human.class);
        newHuman.say(); // print "Hi , World!"
    }

    private static class Human {
        private String message;
        private Place place;

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public Place getPlace() {
            return place;
        }

        public void setPlace(Place place) {
            this.place = place;
        }

        public void say() {
            System.out.println();
            System.out.println(getMessage() + " , " + getPlace().getName() + "!");
        }
    }

    private static class Place {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

Schnelle GSON-Beispiele und How To's

In diesen Beispielen verwenden wir Google Gson.

1. Wie man eine Karte in JSON konvertiert

Angenommen, ich gebe Ihnen eine Map mit einem "String"-Schlüssel und einem "T"-Wert. Und ich sage Ihnen, Sie sollen sie abbilden oder in einen JSON-String konvertieren.

Wie würden Sie das tun?

Nun, Sie können einfach die Methode "toJson()" der Klasse "Gson" verwenden. Sie müssen zuerst die Klasse "Gson" instanziieren und dann diese Methode aufrufen.

    public static <T> String mapToJsonStr(Map<String, T> map) {
        Gson gson = new Gson();
        return gson.toJson(map);
    }
2. Wie man JSON in eine Map konvertiert

Was ist, wenn Sie einen JSON-String haben und wir Sie bitten, ihn in eine Map-Datenstruktur in Java zu konvertieren.

Nun, dann würden Sie die Methode fromJson() von Gson verwenden.

Dieses Mal müssen Sie jedoch ein TypeToken mit dieser Map als generischen Parameter instanziieren. Dann übergeben Sie den json-String als ersten Parameter in der fromJson()-Methode. Und die Type Instanz als unseren zweiten Parameter.

    public static <T> Map<String, T> jsonStrToMap(String jsonStr) {
        Gson gson = new Gson();
        Type type = new TypeToken<Map<String, T>>() {
        }.getType();
        return gson.fromJson(jsonStr, type);
    }
3. Wie man JSON in ein Objekt umwandelt

Also gut, Sie haben einen JSON-String und sollen ihn in ein Objekt eines bestimmten Typs konvertieren.

Nun, wieder übergeben Sie den JSON-String und den Typ an die Methode fromJson().

    public static <T> T jsonToObj(String jsonStr, Class<T> classOfT) {
        return new Gson().fromJson(jsonStr, classOfT);
    }
4. Wie man JSON in eine ArrayList konvertiert

Ein häufiges Szenario in vielen Projekten ist die Konvertierung eines json-Strings in eine ArrayList, die am häufigsten verwendete Sammlung.

Wir beginnen, indem wir die TextUtils isEmpty()` Methode verwenden, um auf leere Werte zu prüfen.

Dann erhalten wir unsere TypeToken Instanz mit ArrayList von JSONObjects, die als unser generischer Typ übergeben wird.

Dann verwenden wir die Methode fromJson(), um unsere ArrayList von JSONObjects zu erhalten.

Jetzt können wir eine Schleife durch die Liste ziehen und die ArrayList füllen, die wir auffüllen wollen.

    public static <T> ArrayList<T> jsonToArrayList(String json, Class<T> clazz) {
        if (TextUtils.isEmpty(json)) {
            return null;
        }
        Type type = new TypeToken<ArrayList<JsonObject>>() {
        }.getType();
        ArrayList<JsonObject> jsonObjects = new Gson().fromJson(json, type);

        ArrayList<T> arrayList = new ArrayList<>();
        for (JsonObject jsonObject : jsonObjects) {
            arrayList.add(new Gson().fromJson(jsonObject, clazz));
        }
        return arrayList;
    }
5. Wie man eine Liste in JSON konvertiert

Eine andere übliche Sache ist die Konvertierung einer Liste in einen JSON-String. Vielleicht wollen Sie diese Liste serialisieren und über das Wo oder eine einfache Art und Weise, sie als API darzustellen, senden.

Auch das erledigt die Methode toJson() ganz einfach für uns.

    public static <T> String listToJson(List<T> list) {

        Gson gson = new Gson();
        String jsonstring = gson.toJson(list);
        return jsonstring;

    }
6. Wie man ein Objekt in JSON konvertiert

Wenn Sie ein Objekt haben und es in JSON konvertieren wollen, rufen Sie einfach die Methode toJson() auf, wobei Sie das Objekt als Parameter übergeben.

    public static <T> String object2Json(T t) {
        Gson gson = new Gson();
        return gson.toJson(t);
    }
7. Wie man bestimmte Felder von der Serialisierung ohne Annotationen ausschließt

Normalerweise steuert man die einzuschließenden Felder über Annotationen in Gson. Wir können es aber auch ohne Annotationen machen.

Gson gson = new GsonBuilder()
   .setExclusionStrategies(new TestExclStrat())
   //.serializeNulls() <-- uncomment to serialize NULL fields as well
   .create();
 Student src = new Student();
 String json = gson.toJson(src);
 System.out.println(json);

Referenz

8. Wie man mit Gson Pretty Print macht

PrettyPrinting bedeutet, Leerzeichen hinzuzufügen, um unsere JSON-Daten besser lesbar zu machen. Sie können GsonBuilder#setPrettyPrinting() verwenden.

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(uglyJSONString);
String prettyJsonString = gson.toJson(je);

Referenz

9. Wie man JSON mit TreeModel schreibt

Hier ist die wichtige Methode. Wir haben zwei Methoden zum Lesen und Schreiben von json Daten.

Hier ist die vollständige Klasse:


import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.IOException;

public class TreeModel {
    public static void main(String[] args) throws IOException {
        System.out.print("readJson: ");
        readJson();
        System.out.println();
        System.out.print("writeJson: ");
        writeJson();
    }

    /**
     *  Example to readJson using TreeModel
     */
    private static void readJson() throws IOException {
        JsonParser parser = new JsonParser();
        JsonElement jsonElement = parser.parse("{"message":"Hi","place":{"name":"World!"}}");
        JsonObject rootObject = jsonElement.getAsJsonObject();
        String message = rootObject.get("message").getAsString(); // get property "message"
        JsonObject childObject = rootObject.getAsJsonObject("place"); // get place object
        String place = childObject.get("name").getAsString(); // get property "name"
        System.out.println(message + " " + place); // print "Hi World!"*/
    }

    /**
     * Example to writeJson using TreeModel
     */
    private static void writeJson() throws IOException {
        JsonObject rootObject = new JsonObject();
        rootObject.addProperty("message", "Hi");
        JsonObject childObject = new JsonObject();
        childObject.addProperty("name", "World!");
        rootObject.add("place", childObject);

        Gson gson = new Gson();
        String json = gson.toJson(rootObject);
        System.out.println(json); // print "{"message":"Hi","place":{"name":"World!"}}"
    }
}
10. Wie man String in Objekt umwandelt

Gson myGson = new GsonBuilder().setPrettyPrinting().create();
myGson.fromJson(jsonString, Person.class)
11. JSON-String hübsch drucken

private static String pretty(String json) {
  JsonElement gson = new JsonParser().parse(json);
  return new GsonBuilder().setPrettyPrinting().serializeNulls().create().toJson(gson);
 }
}
12. Streaming API Lesen und Schreiben mit Gson

Dies ist ein Beispiel für das Lesen und Schreiben von JSON Streaming API. Wir werden die Klassen JsonReader, JsonToken und JsonWriter verwenden.

Wir haben drei Methoden, unsere main() Methode, eine readJSON() Methode und writeJson() Methode.

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import java.io.*;
import java.nio.charset.Charset;

public class StreamingAPI {
    public static void main(String[] args) throws IOException {
        System.out.print("readJson: ");
        readJson();
        System.out.println();
        System.out.print("writeJson: ");
        writeJson();
    }

    /**
     *  Example to readJson using StreamingAPI
     */
    private static void readJson() throws IOException {
        String str = "{"message":"Hi","place":{"name":"World!"}}";
        InputStream in = new ByteArrayInputStream(str.getBytes(Charset.forName("UTF-8")));
        JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
        while (reader.hasNext()) {
            JsonToken jsonToken = reader.peek();
            if(jsonToken == JsonToken.BEGIN_OBJECT) {
                reader.beginObject();
            } else if(jsonToken == JsonToken.END_OBJECT) {
                reader.endObject();
            } if(jsonToken == JsonToken.STRING) {
                System.out.print(reader.nextString() + " "); // print Hi World!
            } else {
                reader.skipValue();
            }
        }
        reader.close();
    }

    /**
     * Example to writeJson using StreamingAPI
     */
    private static void writeJson() throws IOException {
        OutputStream outputStream = new ByteArrayOutputStream();
        JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.beginObject(); // main object
        writer.name("message");
        writer.value("Hi");
        writer.name("place"); // save object Place
        writer.beginObject();
        writer.name("name");
        writer.value("World!");
        writer.endObject();
        writer.endObject();
        writer.close();
        System.out.println(outputStream.toString()); // print "{"message":"Hi","place":{"name":"World!"}}"
    }
}
13. Vollständig wiederverwendbare Gson Utility Klasse

ublic class GsonUtils {

    privatestaticfinaldoubleVERSION=1.0f;
    private static final Gson sGson = createGson(true, false);

    private static final Gson sGsonExpose = createGson(true, true);

    private GsonUtils () {
        thrownewAssertionError();
    }

    /**
     * Create the standard {@link Gson} configuration
     *
     * @return created gson, never null
     */
    public static Gson createGson() {
        return createGson(true, false);
    }

    /**
     * Create the standard {@link Gson} configuration
     *
     * @param serializeNulls whether nulls should be serialized
     * @return created gson, never null
     */
    private static Gson createGson(final boolean serializeNulls,
                                   final boolean exposeEnable ) {
        final GsonBuilder builder = new GsonBuilder ();
        if (serializeNulls) {
            builder.serializeNulls();
        }
        builder . setVersion ( VERSION );
        // json format
        // builder.setPrettyPrinting();
        if (exposeEnable) {
            builder.excludeFieldsWithoutExposeAnnotation();
        }
        return builder.create();
    }

    /**
     * Get reusable pre-configured {@link Gson} instance
     *
     * @return Gson instance
     */
    public static Gson getGson() {
        return sGson;
    }

    /**
     * Get reusable pre-configured {@link Gson} instance
     *
     * @return Gson instance
     */
    public static Gson getGson(final boolean exposeEnable) {
        return exposeEnable ? sGsonExpose : sGson;
    }

    /**
     * Convert object to json, only exports attributes that have been annotated with @Expose
     *
     * @param object
     * @return json string
     */
    public static String toJson(final Object object) {
        return toJson(object, true);
    }

    /**
     * Convert object to json
     *
     * @param object
     * @param exposeEnable Whether to export only @Expose annotated properties, true is only exported by @Expose
     * @return json string
     */
    public static String toJson(final Object object,
                                final boolean exposeEnable ) {
        return exposeEnable ? sGsonExpose.toJson(object) : sGson.toJson(object);
    }

    /**
     * Convert string to given type
     *
     * @param json
     * @param type
     * @return instance of type
     */
    public static <V> V fromJson(String json, Class<V> type) {
        return sGson.fromJson(json, type);
    }

    /**
     * Convert string to given type
     *
     * @param json
     * @param type
     * @return instance of type
     */
    public static <V> V fromJson(String json, Type type) {
        returnsGson.fromJson(json,type);
    }

    /**
     * Convert content of reader to given type
     *
     * @param reader
     * @param type
     * @return instance of type
     */
    public static <V> V fromJson(Reader reader, Class<V> type) {
        return sGson.fromJson(reader, type);
    }

    /**
     * Convert content of reader to given type
     *
     * @param reader
     * @param type
     * @return instance of type
     */
    public static <V> V fromJson(Reader reader, Type type) {
        returnsGson.fromJson(reader,type);
    }

    /**
     * Convert object object to map only supports basic types
     *
     * @param src
     * @param exposeEnable
     * @return
     */
    public static HashMap<String, String> toMap(Object src, boolean exposeEnable) {
        Gson gson = exposeEnable ? sGsonExpose : sGson;
        HashMap<String, String> params = new HashMap<String, String>();
        try {
            if (src == null) {
                return null;
            }
            JsonElement jsonTree = gson . toJsonTree ( src );
            JsonObject jsonObj = jsonTree.getAsJsonObject();
            Iterator<Entry<String, JsonElement>> iterator = jsonObj.entrySet().iterator();
            String curKey;
            JsonElement curVal ;
            while (iterator.hasNext()) {
                Entry<String, JsonElement> entry = iterator.next();
                curKey = entry.getKey();
                curVal = entry.getValue();
                if (!curVal.isJsonNull()) {
                    params.put(curKey, curVal.getAsString());
                }
            }
            return params;
        } Catch ( Exception e ) {
            e . printStackTrace ();
        }
        returnparams;
    }

    public static <T> String mapToJson(Map<String, T> map) {
        Gson gson =  new  Gson ();
        return gson . toJson (folder);
    }
}

Categorized in: