【问题标题】:Use GSON to map changing field name to POJO使用 GSON 将更改的字段名称映射到 POJO
【发布时间】:2015-07-19 17:39:49
【问题描述】:

我正在编写一个 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 创建一个 Java 类,让 RetroFit 将字段映射到变量?

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

谢谢。

【问题讨论】:

    标签: android gson retrofit


    【解决方案1】:

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

    【讨论】:

    • 嗨,谢谢。快速的问题。 JsonSerialized 是什么? Android Studio 找不到它来导入它。
    • 我看到那里有一个错字。它应该是 JsonSerializer 而不是 JsonSerialzied
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2018-07-29
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多