这是我尝试使用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解析库.
据我了解,你不能以直接的方式做到这一点,因为 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对象。
注意:我没有尝试这段代码,但它应该是这样的或非常相似的东西。
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |