android - 使用 GSON 将变化的字段名映射到 POJO

标签 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 或用户。

谢谢。

最佳答案

创建一个名为 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();

关于android - 使用 GSON 将变化的字段名映射到 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31504042/

相关文章:

java - 安卓 : getting file path like (downloads/my_downloads/286) this using open with option using chrome document viewer

android - 附近的消息 api : how to retrieve pictures and videos?

java - 使用 Gson 从 JSON 初始化类的字段

android - 输出顺序显示错误

java - 从处理程序内将整数传递给 Activity

java - 如何修复 'java.lang.ClassCastException: Activity must implement fragment' s 回调'

java - 使用 GSON 从对象转换为字符串时添加了不需要的字符

java - 使用 GSON 在 Java 中组织输出 JSON 响应

java - 如何在新的 Callback<ResponseBody> 中访问请求 MultipartBody 信息?

android - Retrofit 返回 LinkedTreeMap 而不是 JSON