【问题标题】:Google JSON, Deserialize class and properly set class field valuesGoogle JSON,反序列化类并正确设置类字段值
【发布时间】:2017-08-01 06:11:10
【问题描述】:

如果 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,我知道如果我也想序列化钱,我应该使用 Expose 注释,但主要问题是如果在将来会添加更多类变量并且旧对象不包含 Money,它们将返回 null、false 或 0,而不是它们预设的类值。

谢谢。

【问题讨论】:

  • 您使用的是哪个版本的Gson?显然这仍然是一个未解决的问题 - 请参阅here。您是否尝试包含默认(无参数)构造函数并查看money 字段是否仍包含0?我的建议是您使用GsonBuilder,然后创建您自己的自定义反序列化器。
  • 非常感谢,我所做的只是添加了一个空构造函数,现在它返回 10.0,您介意解释一个空白构造函数解决了问题吗?
  • 嗨,很高兴这对您有所帮助。为了让您可以接受答案并将您的问题标记为已回答,我已将其解释为答案。

标签: java gson json-deserialization


【解决方案1】:

只需向 Exmaple 类添加一个无参数构造函数。它将迫使 gson 开始使用 class.newInstance 来创建对象,并且您将获得类的常规初始化(包括您的情况下公共变量的正确值。)

【讨论】:

    【解决方案2】:

    添加一个无参数构造函数,它将被使用。

    请参阅com.google.gson.internal.newUnsafeAllocator(?,?) 了解如何构造新实例。

    【讨论】:

      【解决方案3】:

      您可能需要包含一个默认(无参数)构造函数,然后您不会在其中初始化任何值,如下所示:

      public Example(){ 
       //nothing goes on here...
      }
      

      Gson 反序列化到您的 POJO 中时 - 它调用默认构造函数并将所有缺失值设置为 null0(取决于类型) - 因此通过添加您自己的构造函数,Gson 将调用它.这就是为什么当您包含默认构造函数时它现在可以工作的原因。 编码愉快。

      【讨论】:

      • 感谢 Ishmael,私有 noarg 构造函数是否可以正常工作,但从代码实践的角度来看,我想知道
      【解决方案4】:

      如果您的字段可以设置为 static,您也可以这样做,并且 gson 在实例化您的 class 时将不理会它,而无需默认 构造函数 .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多