java - Retrofit2:将带有动态键的 JSON 转换为 Map<String, Model>,其中 Model 也包含这些键

标签 java android json gson retrofit2

我将 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/

相关文章:

菜单中的 Java Swing JSeparator 放置不正确

android - 带有子项的 ListView。 (安卓)

json - 使用 Socrata SODA API 按日期时间查询最新行

asp.net-mvc - 双引号 - $.parseJSON 与 Newtonsoft JsonConvert 和 MVC Html.Raw

java - 如何将两个数组转换为一个映射<k,v>

Java解析项目路径

android - 无法在摩托罗拉 XT907 上运行 Android 应用程序

javascript - 如何从多维数组中过滤产品?

java - 如何通知第二个线程变量的更改

java - 在 Android Studio 中丢失对静态数据的引用