我正在编写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
或用户。
感谢。
答案 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();