Java Gson-它是如何工作的?
我正在使用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
内部外部的列表
,然后将其转换为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
代码中没有涉及通用参数。每件事都是具体的。我假设参考的是列表
。