Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gson - how does it work?

Tags:

java

json

gson

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;
        }

    }
}
}
like image 732
yosi Avatar asked Jan 26 '26 07:01

yosi


1 Answers

reflection

Field field = Outer.class.getDeclaredField("innerList");
System.out.println(field.getGenericType().toString());

output:
java.util.List<foo.JsonTest$Outer$Inner>
like image 149
bpgergo Avatar answered Jan 27 '26 21:01

bpgergo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!