Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GoogleJSON,反序列化类并正确设置类字段值_Java_Gson_Json Deserialization - Fatal编程技术网

Java GoogleJSON,反序列化类并正确设置类字段值

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

如果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 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构造函数可以吗?它可以工作,但我想从代码实践的角度来看