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
- Konvertierung von Java-Objekten in JSON und zurück.
- Konvertierung eines JSON-Strings in ein entsprechendes Java-Objekt.
Warum wurde Gson geschaffen?
Hier sind die Gründe für die Erstellung von Gson:
- Um die Arbeit mit JSON einfach zu machen, indem man einfache
toJson()
undfromJson()
Methoden bereitstellt. Diese Methoden ermöglichen es uns, Java-Objekte in JSON zu konvertieren und andersherum. - Vorhandene, nicht veränderbare Objekte können in und aus JSON konvertiert werden.
- Umfassende Unterstützung von Java Generics zu bieten.
- Ermöglichung benutzerdefinierter Darstellungen für Objekte
- 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:
JsonObject
JsonArray
JsonPrimitive
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:
- 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. - 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.
- 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);
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);
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);
}
}