Gson - как это работает? - PullRequest
       6

Gson - как это работает?

2 голосов
/ 15 декабря 2011

Я использую Gson, он может делать то, чего я не ожидал.Пожалуйста, смотрите код ниже, я создаю List из Inner внутри Outer и затем преобразую его в строку json.

Я не могу понять, как на обратном пути от объектов Json, Гсон знает, что он должен создавать объекты из класса Inner.Насколько я знаю, общая информация не является частью скомпилированных классов, и в строке Json нет никакой подсказки.Тем не менее, Gson создает список Inner внутри

Кто-нибудь знает, как это делает Gson?

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

    }
}
}

Ответы [ 2 ]

4 голосов
/ 15 декабря 2011

отражение

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

output:
java.util.List<foo.JsonTest$Outer$Inner>
1 голос
/ 15 декабря 2011

Тип Erasure в Java не уничтожает всю информацию общего типа, только некоторые из них. Тип информации о полях и параметрах сохраняется. Таким образом, Gson имеет всю информацию о типах, доступную в определении скомпилированного класса, которую он должен знать для десериализации экземпляров Inner.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...