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

时间:2013-04-24 14:10:09

标签: java gson

这是我尝试使用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解析库。

2 个答案:

答案 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)