簡體   English   中英

Gson-運作方式如何?

[英]Gson - how does it work?

我正在使用Gson,它能夠完成我沒想到的事情。 請看下面的代碼,我創建一個ListInnerOuter ,然后將其轉化為JSON字符串。

我不明白在從Json tho對象返回的過程中,Gson知道它應該從Class Inner創建對象。 據我所知,泛型信息不是已編譯類的一部分,並且在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;
        }

    }
}
}

反射

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

output:
java.util.List<foo.JsonTest$Outer$Inner>

Java中的Type Erasure不會破壞所有通用類型信息,只是其中一些信息。 保留字段和參數的類型信息。 因此,Gson在反序列化Inner實例時需要了解所有已編譯類定義中可用的類型信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM