Java Gson-它是如何工作的?

Java Gson-它是如何工作的?,java,json,gson,Java,Json,Gson,我正在使用Gson,它可以做一些我没有预料到的事情。 请看下面的代码,我正在创建内部外部的列表,然后将其转换为json字符串 我无法理解在从Json tho对象返回的过程中,Gson如何知道它应该从类内部创建对象。据我所知,泛型信息不是编译类的一部分,Json字符串中也没有任何线索。然而,Gson正在创建一个内部列表 有人知道格森是怎么做的吗 public class JsonTest { public static void main(String[] args){ Inner

我正在使用Gson,它可以做一些我没有预料到的事情。 请看下面的代码,我正在创建
内部
外部
列表
,然后将其转换为json字符串

我无法理解在从Json tho对象返回的过程中,Gson如何知道它应该从类
内部
创建对象。据我所知,泛型信息不是编译类的一部分,Json字符串中也没有任何线索。然而,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;
        }

    }
}
}
公共类JsonTest{
公共静态void main(字符串[]args){
内部1=新的内部();
1.第1组(100);
1.第2组(200);
内部2=新的内部();
2.第1组(101);
2.设置2(201);
外部=新的外部();
外放线1(500);
外放线2(600);
outer.getInnerList().add(inner1);
outer.getInnerList().add(inner2);
Gson Gson=新的Gson();
字符串jsonStr=gson.toJson(外部);
系统输出打印LN(jsonStr);
OuterOuterFromJSON=gson.fromJson(jsonStr,Outer.class);
System.out.println(outerFromJson.getInnerList().get(0.getClass());
}
公共静态类外部{
私人int out1;
私人int out2;
private List innerList=new ArrayList();
public int getOut1(){
返回1;
}
公共无效设置1(int out1){
this.out1=out1;
}
public int getOut2(){
返回2;
}
公共无效设置2(int out2){
this.out2=out2;
}
公共列表getInnerList(){
返回内部列表;
}
public void setInnerList(列表innerList){
this.innerList=innerList;
}
公共静态类内部{
私有int-in1;
私有int-in2;
公共int getIn1(){
返回1;
}
公共无效集1(整数集1){
这个。in1=in1;
}
公共int getIn2(){
返回2;
}
公共无效设置2(整数设置2){
这是in2=in2;
}
}
}
}
在Java中不会破坏所有的泛型类型信息,只是其中的一部分。字段和参数的类型信息将被保留。因此,Gson拥有编译类定义中可用的所有类型信息,它需要知道这些信息才能反序列化
内部

反射的实例

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

output:
java.util.List<foo.JsonTest$Outer$Inner>
Field-Field=Outer.class.getDeclaredField(“innerList”);
System.out.println(field.getGenericType().toString());
输出:
java.util.List

代码中没有涉及通用参数。每件事都是具体的。我假设参考的是
列表