I am using Gson it is able to do something I was not expecting.
Please see the code below, I am creating a List of Inner inside Outer and then transforming it to json string.
I cannot understand how on the way back from Json tho objects, Gson knows it should create objects from Class Inner. The generic information is not part of the compiled classes as far as I know, and there is no clue within the Json string. Nevertheless, Gson is creating a list of Inner inside
Does anyone knows how Gson is doing it?
public class JsonTest {
public static void main(String[] args){
Inner inner1 = new Inner();
inner1.setIn1(100);
inner1.setIn2(200);
Inner inner2 = new Inner();
inner2.setIn1(101);
inner2.setIn2(201);
Outer outer = new Outer();
outer.setOut1(500);
outer.setOut2(600);
outer.getInnerList().add(inner1);
outer.getInnerList().add(inner2);
Gson gson = new Gson();
String jsonStr = gson.toJson(outer);
System.out.println(jsonStr);
Outer outerFromJson = gson.fromJson(jsonStr, Outer.class);
System.out.println(outerFromJson.getInnerList().get(0).getClass());
}
public static class Outer{
private int out1;
private int out2;
private List<Inner> innerList = new ArrayList<Inner>();
public int getOut1() {
return out1;
}
public void setOut1(int out1) {
this.out1 = out1;
}
public int getOut2() {
return out2;
}
public void setOut2(int out2) {
this.out2 = out2;
}
public List<Inner> getInnerList() {
return innerList;
}
public void setInnerList(List<Inner> innerList) {
this.innerList = innerList;
}
public static class Inner{
private int in1;
private int in2;
public int getIn1() {
return in1;
}
public void setIn1(int in1) {
this.in1 = in1;
}
public int getIn2() {
return in2;
}
public void setIn2(int in2) {
this.in2 = in2;
}
}
}
}
reflection
Field field = Outer.class.getDeclaredField("innerList");
System.out.println(field.getGenericType().toString());
output:
java.util.List<foo.JsonTest$Outer$Inner>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With