Last active
January 26, 2016 21:25
-
-
Save e-d/dc9451b2e1eece74eac5 to your computer and use it in GitHub Desktop.
Example of deserializing JSON (using GSON) to various object types based on a type embedded in the JSON object.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class GsonTestClass { | |
static Gson gson = new Gson(); | |
/* Running the main method will produce the following output: | |
* | |
* Before Serializing/Deserializing: {"foo1":"fooooo","bar1":"barrrr","type":"POJO1"} | |
* Before Serializing/Deserializing: {"foo2":"fooooooooooo","bar2":["bar","barr"],"type":"POJO2"} | |
* After Serialization (Knowing Type): {"foo1":"fooooo","bar1":"barrrr","type":"POJO1"} | |
* After Serialization (Knowing Type): {"foo2":"fooooooooooo","bar2":["bar","barr"],"type":"POJO2"} | |
* After Serialization (Type Unknown): {"foo1":"fooooo","bar1":"barrrr","type":"POJO1"} | |
* After Serialization (Type Unknown): {"foo2":"fooooooooooo","bar2":["bar","barr"],"type":"POJO2"} | |
*/ | |
public static void main(String[] args) { | |
Pojo1 one = new Pojo1(); | |
Pojo2 two = new Pojo2(); | |
System.out.println("Before Serializing/Deserializing:\t" + one); | |
System.out.println("Before Serializing/Deserializing:\t" + two); | |
String json1 = gson.toJson(one); | |
String json2 = gson.toJson(two); | |
// Knowing type beforehand. | |
Pojo1 oneAfter = gson.fromJson(json1, Pojo1.class); | |
Pojo2 twoAfter = gson.fromJson(json2, Pojo2.class); | |
System.out.println("After Serialization (Knowing Type):\t" + oneAfter); | |
System.out.println("After Serialization (Knowing Type):\t" + twoAfter); | |
// Without knowing type (get type using JsonParser). | |
JsonParser parser = new JsonParser(); | |
PojoType type1 = PojoType.valueOf(parser.parse(json1).getAsJsonObject().getAsJsonPrimitive("type").getAsString()); | |
PojoType type2 = PojoType.valueOf(parser.parse(json2).getAsJsonObject().getAsJsonPrimitive("type").getAsString()); | |
JsonPojo oneAfterAbstract = gson.fromJson(json1, type1.typeClass); | |
JsonPojo twoAfterAbstract = gson.fromJson(json2, type2.typeClass); | |
System.out.println("After Serialization (Type Unknown):\t" + oneAfterAbstract); | |
System.out.println("After Serialization (Type Unknown):\t" + twoAfterAbstract); | |
} | |
static abstract class JsonPojo { | |
PojoType type; | |
@Override | |
public String toString() { | |
return gson.toJson(this); // Using Gson for easy toString(). | |
} | |
} | |
static class Pojo1 extends JsonPojo { | |
String foo1 = "fooooo"; | |
String bar1 = "barrrr"; | |
public Pojo1() { | |
type = PojoType.POJO1; | |
} | |
} | |
static class Pojo2 extends JsonPojo { | |
String foo2 = "fooooooooooo"; | |
List<String> bar2 = Arrays.asList("bar", "barr"); | |
public Pojo2() { | |
type = PojoType.POJO2; | |
} | |
} | |
static enum PojoType { | |
POJO1(Pojo1.class), | |
POJO2(Pojo2.class), | |
; | |
Class<? extends JsonPojo> typeClass; | |
private PojoType(Class<? extends JsonPojo> typeClass) { | |
this.typeClass = typeClass; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment