这是我尝试使用GSON消费的JSON的一个例子:
{
"person": {
"name": "Philip"
"father.name": "Yancy"
}
}
我想知道是否可以将此JSON反序列化为以下结构:
public class Person
{
private String name;
private Father father;
}
public class Father
{
private String name;
}
那样:
p.name == "Philip"
p.father.name == "Yancy"
目前我正在使用@SerializedName
获取包含句点的属性名称,例如:
public class Person
{
private String name;
@SerializedName("father.name")
private String fathersName;
}
然而,这并不理想。
从文档看,它似乎不是立即可能的,但可能有一些我错过了 - 我是新手使用GSON。
不幸的是我无法更改我正在使用的JSON,而且我不愿意切换到另一个JSON解析库。
答案 0 :(得分:4)
据我了解,您无法以直接方式执行此操作,因为Gson会将father.name
理解为单个字段。
您需要编写自己的自定义反序列化程序。请参阅Gson用户指南说明here。
我从未尝试过,但似乎并不太难。这个post也可以提供帮助。
看看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);
}
}
假设你有合适的构造函数......
然后:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Person.class, new PersonDeserializer());
Gson gson = gsonBuilder.create();
Person person = gson.fromJson(jsonString, Person.class);
Gson会调用你的反序列化器,以便将JSON反序列化为Person
对象。
注意:我没有尝试过此代码,但它应该是这样或类似的东西。
答案 1 :(得分:0)
我仅靠Gson不能做到这一点。我需要一个新的库“ JsonPath”。我使用Jackson的ObjectMapper将对象转换为字符串,但是您可以轻松地使用Gson。
public static String getProperty(Object obj, String prop) {
try {
return JsonPath.read(new ObjectMapper().writeValueAsString(obj), prop).toString();
} catch (JsonProcessingException|PathNotFoundException ex) {
return "";
}
}
// 2 dependencies needed:
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
// https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path
// usage:
String motherName = getProperty(new Person(), "family.mother.name");
// The Jackson can be easily replaced with Gson:
new Gson().toJson(obj)