gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:09:12 27 4
gpt4 key购买 nike

我正在编写一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com