我将 Retrofit 2 与 Gson 和 RxJava 结合使用。我的 JSON 数据看起来像这样:
{
"groups": {
"1": {
"name": "First group",
"type": "some data",
// ... more data
},
"2": {
"name": "Second group",
"type": "some data",
// ... more data
},
"3": {
"name": "Third group",
"type": "some data",
// ... more data
}
// 4, 5, 6, etc...
},
// ... more data
}
在上面的示例中,“键”1、2、3 是整数,但它们也可以是唯一的字符串。我想将此 JSON 数据映射为如下所示:
public class MyData {
@SerializedName("groups")
private Map<String, Group> mGroups;
// ... more data
}
public class Group {
// TODO: This should be "1", "2", "3", etc.
@SerializedName(???)
private String mId;
// This should be "First group", "Second group", "Third group", etc.
@SerializedName("name")
private String mName;
// This should be "some data"
@SerializedName("type")
private String mType;
// ... more data
}
将动态键 (1, 2, 3) 也放入 Group
对象中的最佳方法是什么?我自己不托管 JSON 数据,因此无法将其更改为其他格式。
最佳答案
步骤 A - 创建小组类(class):
public class Group {
String name;
String type;
}
步骤 B - 创建组类:
public class Groups {
List<Group> userList;
}
步骤 C - 创建 GSON 反序列化器类
public class MyDeserializer implements JsonDeserializer<Groups> {
private final String groups_key = "groups";
@Override
public Groups deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Groups groups = new Groups();
JsonObject object = json.getAsJsonObject().getAsJsonObject(groups_key);
Map<String, Group> retMap = new Gson().fromJson(object, new TypeToken<HashMap<String, Group>>() {}.getType());
List<Group> list = new ArrayList<Group>(retMap.values());
groups.userList = list;
return groups;
}
}
步骤 D - 创建 Gson 对象时注册反序列化器
Gson gson = new GsonBuilder()
.registerTypeAdapter(Groups.class, new MyDeserializer()).create();
步骤 E - 通过转换您的 JSON 对象。 Gson
Groups groups = gson.fromJson(jsonExmple, Groups.class);
注释:
- 当您的 JSON 对象变大时,您可以扩展您的组 类并添加更多变量。请记住,您需要在解串器类中反射(reflect)所有内容。 :)
- 当变量的名称与 JSON 键不同时,请使用 @SerializedName 注释
关于java - Retrofit2:将带有动态键的 JSON 转换为 Map<String, Model>,其中 Model 也包含这些键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45131547/