使用GSON将更改字段名称映射到POJO

时间:2015-07-19 17:39:50

标签: android gson retrofit

我正在编写Android个应用,并使用RetroFit与REST API进行通信。我写了所有的类/ POJO,除了一个。

这是特定类的Java。 这是父类,它是问题的根源。我需要能够将userNameResponse变量映射到下面JSON中的用户名

public class DiTopicStats {

    private UserNameResponse userNameResponse;

    public UserNameResponse getUserNameResponse() {
        return userNameResponse;
    }

    public void setUserNameResponse(UserNameResponse userNameResponse) {
        this.userNameResponse = userNameResponse;
    }
}

和子类,只要我可以从上面的父类映射到它就应该没问题:

public class UserNameResponse {

    //Fields
    //Getters and Setters
}

返回的JSON包含一个每个响应更改的字段。该字段是用户名。例如:

{
    "sMessage": "",
    "diStatus": {
        "diTopicWrongAns": {
            //Some fields
        },
        "diOverallStats": {
            //Some more fields
        },
        "diUserStats": {
            "John Smith": { //PROBLEM: This name changes
                //some other fields
            }
        }
    }
}

因此,在这种情况下,名称“John Smith”具有动态字段名称。实际上,它可以是包含字母,数字,-.的任何字符串。

我的问题是,使用RetroFit,如何创建一个允许RetroFit将字段映射到变量的Java类?

我知道你可以指定一个SerialisedName,但这可以在运行时以编程方式完成,因为我将在此阶段拥有name或用户。

感谢。

1 个答案:

答案 0 :(得分:2)

创建一个名为DiUserStats的pojo,然后定义一个自定义的GsonTypeAdapter,例如。

public class DiUserStatsTypeAdapter implements JsonDeserializer<DiUserStats>, JsonSerializer<DiUserStats> {

    @Override
    public DiUserStats deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        DiUserStats target = new DiUserStats();
        JsonObject jsonObject = json.getAsJsonObject();
        Map.Entry<String,JsonElement> object =(Map.Entry<String,JsonElement>)jsonObject.entrySet().toArray()[0];
        target.setName(object.getKey());
        JsonObject targetValues = object.getValue().getAsJsonObject();
        /*parse values to your DiUserStats as documented using targetValues.get("fooProperty").getAsString(), etc */
        return target;
    }

    @Override
    public JsonElement serialize(DiUserStats src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject obj = new JsonObject();
        JsonObject values = new JsonObject();
        values.addProperty("foo", src.getFoo);
        obj.addProperty(target.getName(), values);
        return obj;
    }

} 

然后在设置Gson时使用构建器并添加自定义类型适配器,例如

Gson gson = new GsonBuilder().registerTypeAdapter(DiUserStats.class, new DiUserStatsTypeAdapter()).create();