当 JSON 不包含某个字段时,Gson 会将其设置为 null 吗?

Will Gson set a field to null when JSON doesn't contain it?

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

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

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

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

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

我试过实现这个。这是我的代码。我希望最后的输出能回答你的问题。

JSON 使用:

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

主要class:

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 deg, nameWithDefault=Default name)

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