Java GoogleJSON,反序列化类并正确设置类字段值
如果Gson找不到特定元素,在保留默认类变量值的同时用Gson反序列化对象的最佳方法是什么 下面是我的例子:Java GoogleJSON,反序列化类并正确设置类字段值,java,gson,json-deserialization,Java,Gson,Json Deserialization,如果Gson找不到特定元素,在保留默认类变量值的同时用Gson反序列化对象的最佳方法是什么 下面是我的例子: public class Example { @Expose public String firstName; @Expose public String lastName; @Expose public int age; //Lets give them 10 dollars. public double money = 10; public Example(String fir
public class Example {
@Expose
public String firstName;
@Expose
public String lastName;
@Expose
public int age;
//Lets give them 10 dollars.
public double money = 10;
public Example(String firstName, String lastName, int age, double money) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.money = money;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public double getMoney() {
return money;
}
}
主要类别:
public class ExampleMain {
public static void main(String[] args) {
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Example example = new Example("John", "Doe", 24, 10000D);
String json = gson.toJson(example);
Example example2 = gson.fromJson(json,Example.class);
System.out.println(example2.getMoney());
}
}
example2的输出是0.0,但不应该是10.0,因为类已经定义了10.0,我知道如果我也想序列化money,我应该使用Expose注释,但主要的问题是如果将来添加更多的类变量,旧的对象不包含money,它们将返回null,false或0,而不是其预设的类值
谢谢。您可能需要包括一个默认(无参数)构造函数,在该构造函数中,您不需要初始化任何如下值:
public Example(){
//nothing goes on here...
}
当Gson
反序列化到您的POJO中时-它调用默认构造函数并将所有缺少的值设置为null
或0
(取决于类型)-因此通过添加您自己的构造函数,Gson
将调用它。这就是为什么在包含默认构造函数时它现在可以工作的原因。
愉快的编码。您可能需要包括一个默认(无参数)构造函数,在该构造函数中,您不需要初始化任何如下值:
public Example(){
//nothing goes on here...
}
当Gson
反序列化到您的POJO中时-它调用默认构造函数并将所有缺少的值设置为null
或0
(取决于类型)-因此通过添加您自己的构造函数,Gson
将调用它。这就是为什么在包含默认构造函数时它现在可以工作的原因。
愉快的编码。只需在Exmaple类中添加一个无参数构造函数。它将强制gson开始使用class.newInstance创建对象,您将获得类的定期初始化(包括您案例中公共变量的正确值)。只需向Exmaple类添加一个无参数构造函数即可。它将强制gson开始使用class.newInstance创建对象,您将获得类的定期初始化(在您的情况下包括公共变量的正确值)。添加一个无参数构造函数,它将被使用
有关如何构造新实例的信息,请参阅
com.google.gson.internal.newUnsafeAllocator(?)
。添加一个无参数构造函数,它将被使用
请参阅
com.google.gson.internal.newUnsafeAllocator(?)
,了解如何构造新实例。如果您的字段是静态的,您也可以这样做,而gson在实例化类时将不使用它,没有默认的构造函数如果你的字段是静态的可以,你也可以这样做,gson在实例化你的类
时将不使用它,没有默认的构造函数你使用的是哪个版本的gson
?显然,这方面还有一个悬而未决的问题——见。是否尝试包含默认(无参数)构造函数并查看money字段是否仍然包含0
?我的建议是您使用GsonBuilder
,然后创建自己的自定义反序列化程序。非常感谢,我所做的只是添加了一个空构造函数,现在它返回10.0,您介意解释一个空构造函数修复了这个问题吗?嗨,我很高兴这有帮助。为了让您能够接受答案并将您的问题标记为已回答,我已将此解释为答案。您使用的是哪个版本的Gson
?显然,这方面还有一个悬而未决的问题——见。是否尝试包含默认(无参数)构造函数并查看money字段是否仍然包含0
?我的建议是您使用GsonBuilder
,然后创建自己的自定义反序列化程序。非常感谢,我所做的只是添加了一个空构造函数,现在它返回10.0,您介意解释一个空构造函数修复了这个问题吗?嗨,我很高兴这有帮助。为了让你能够接受答案并将你的问题标记为已回答,我已经将此解释为一个答案。谢谢Ishmael,那么私有noarg构造函数可以吗?它可以工作,但我想从代码实践的角度来看谢谢Ishmael,私有noarg构造函数可以吗?它可以工作,但我想从代码实践的角度来看