Skip to content

Instantly share code, notes, and snippets.

@e-d
Last active January 26, 2016 21:25
Show Gist options
  • Save e-d/dc9451b2e1eece74eac5 to your computer and use it in GitHub Desktop.
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.
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