GSON ist eine von Google entwickelte Java-Bibliothek, welche ursprünglich für den internen Gebrauch bei Google gedacht war. Mit dieser ist, neben vielen anderen Dingen, unter anderem die Serialisierung von Java-Objekten in JSON möglich. Gegeben sei für ein kleines Beispiel die Klasse FooObject:
public class FooObject { private int id; private String key; private String value; public FooObject(int id, String key, String value) { this.id = id; this.key = key; this.value = value; } public int getId() { return id; } public String getKey() { return key; } public String getValue() { return value; } }
Die Klasse besteht aus drei internen Variablen, welche eine Id, einen Key und einen Value halten. Daneben existieren ein Konstruktor und drei Getter-Methoden für die Rückgabe der internen Variablen. Mithilfe von GSON kann eine Instanz der Klasse einfach zu JSON serialisiert werden:
Gson gson = new Gson(); FooObject fooObject = new FooObject(1, "keyA", "valueA"); String jsonFooObject = gson.toJson(fooObject);
Heraus kommt bei dieser Serialisierung folgendes JSON-Objekt:
{ "id":1, "key":"keyA", "value":"valueA" }
Auch die Deserialisierung des Objektes mittels GSON ist kein Problem:
fooObject = gson.fromJson(jsonFooObject, FooObject.class);
Interessanter und komplizierter wird es, wenn Maps mittels GSON serialisiert werden sollen:
Mapvalues = new HashMap<>(); values.put("A", new FooObject(1, "keyA", "valueA")); values.put("B", new FooObject(2, "keyB", "valueB")); values.put("C", new FooObject(3, "keyC", "valueC"));
Die Serialisierung gestaltet sich noch einfach:
String json = gson.toJson(values);
Bei der Deserialisierung mittels:
Mapmap = gson.fromJson(json, Map.class);
erhält der Nutzer allerdings eine LinkedTreeMap. Auf die Werte der Map kann durchaus zugegriffen werden:
String value = map.get("A").get("key");
Allerdings schlägt die Umwandlung in ein Objekt vom Typ FooObject fehl:
FooObject fooObjectB = map.get("A");
Stattdessen erhält der Nutzer eine ClassCastException:
Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to org.example.console.FooObject
Damit der Cast gelingt muss bei der Deserialisierung der Map anders gearbeitet werden:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; ... Type type = new TypeToken
Damit kann die Map mit dem FooObject normal genutzt werden. Mithilfe des TypeTokens kann ein generischer Typ repräsentiert und somit für die Deserialisierung mittels GSON eingesetzt werden.