【问题标题】:Will Gson set a field to null when JSON doesn't contain it?当 JSON 不包含该字段时,Gson 会将其设置为 null 吗?
【发布时间】:2020-03-03 18:09:50
【问题描述】:

我实际上有多个关于 Gson 的问题。

第一个是当提供的 JSON 不包含任何匹配的字段时,Gson 是否会将字段的值设置为 null
例如,当提供的 JSON 具有字段 name 但我将其反序列化为包含 nameavatar 的类时,avatar 会为空吗?

下一个问题与上述问题有关。当我使用已经预定义的值设置字段时,Gson 会覆盖它,即使它未在 JSON 中提供(将其覆盖为 null)还是会简单地忽略该字段并继续前进?

最后我想知道当我使用@SerializedName("username") 但JSON 包含name 时,Gson 是否仍会将值设置为name
我想更新我的 API,包括一些错误的 JSON 字段命名,但我想让使用它的人尽可能顺利地转换它,所以我想仍然(临时)提供旧的字段名称,同时也为新的提供支持。可以使用@SerializedName 注释吗?

我还是 Gson 的初学者,Gson User Guide 对我回答这两个具体问题没有太大帮助(或者我忽略了它,这也是可能的)。

【问题讨论】:

标签: java json gson


【解决方案1】:

我尝试实现这一点。这是我的代码。我希望最后的输出回答你的问题。

使用的 JSON:

{
  "name": "Robert",
  "weather": "19 deg"
}

主类:

public class GSONExample2 {

    private static final String jsonStr = "JSON Mentioned above";

    public static void main(String[] args) {
        GsonDataExample root = new Gson().fromJson(jsonStr, GsonDataExample.class);
        System.out.println(root);

    }

}

POJO:

class GsonDataExample {
    @SerializedName("username")
    private String name;
    private String avatar;
    @SerializedName(value="weather", alternate = "temperature")
    private String weather;
    private String nameWithDefault = "Default name";
    // getters, setters and toString() implemented
}

输出:

GsonDataExample(name=null, avatar=null, weather=19 度, nameWithDefault=默认名称)

要将多个键映射到相同的属性,可以使用@SerializedName(value="weather", alternate = "temperature"),如上所示。

【讨论】:

  • 感谢您的信息。我假设 Gson 只会在找不到(有效)JSON 解析时将类设为 null?
  • 你应该试试看 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
相关资源
最近更新 更多