是否可以使用GSON将句点反序列化为句点作为嵌套对象?

Jon*_*han 5 java gson

这是我尝试使用GSON使用的JSON类型的示例:

{
    "person": {
        "name": "Philip"
        "father.name": "Yancy"
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以将此JSON反序列化为以下结构:

public class Person
{
    private String name;
    private Father father; 
}

public class Father
{
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

以便:

p.name == "Philip"
p.father.name == "Yancy"
Run Code Online (Sandbox Code Playgroud)

目前我正在使用@SerializedName获取包含句点的属性名称,例如:

public class Person
{
    private String name;

    @SerializedName("father.name")
    private String fathersName; 
}
Run Code Online (Sandbox Code Playgroud)

但是,这并不理想.

从文档看,它似乎不是立即可能的,但可能有一些我错过了 - 我是使用GSON的新手.

不幸的是我无法更改我正在消耗的JSON,而且我不愿意切换到另一个JSON解析库.

Mik*_*ikO 4

据我了解,你不能以直接的方式做到这一点,因为 Gson 会将其理解father.name为单个字段。

您需要编写自己的自定义反序列化器。请参阅此处的Gson 用户指南说明。

我从来没有尝试过,但似乎并不太难。这篇文章也可能有帮助。

查看 Gson 的用户指南和该文章中的代码,您将需要如下内容:

private class PersonDeserializer implements JsonDeserializer<Person> {

  @Override
  public Person deserialize(JsonElement json, Type type,
        JsonDeserializationContext context) throws JsonParseException {

    JsonObject jobject = (JsonObject) json;

    Father father = new Father(jobject.get("father.name").getAsString());

    return new Person(jobject.get("name").getAsString(), father);
  }  
}
Run Code Online (Sandbox Code Playgroud)

假设你有合适的构造函数......

进而:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Person.class, new PersonDeserializer());
Gson gson = gsonBuilder.create();
Person person = gson.fromJson(jsonString, Person.class);
Run Code Online (Sandbox Code Playgroud)

Gson 将调用您的反序列化器,以便将 JSON 反序列化为Person对象。

注意:我没有尝试这段代码,但它应该是这样的或非常相似的东西。