5

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

4

2 回答 2

4

据我了解,您不能直接这样做,因为 Gson 将理解father.name为单个字段。

您需要编写自己的Custom Deserializer请参阅此处的 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);
  }  
}

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

进而:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Person.class, new PersonDeserializer());
Gson gson = gsonBuilder.create();
Person person = gson.fromJson(jsonString, Person.class);

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

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

于 2013-04-24T15:31:43.697 回答
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)
于 2018-10-16T09:25:08.807 回答