当前位置: 首页 > 知识库问答 >
问题:

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

景修杰
2023-03-14

我正在将改型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)放入对象的最佳方式是什么?我自己没有托管JSON数据,因此无法将其更改为其他格式。

共有1个答案

易俊远
2023-03-14

步骤A-创建一个组类:

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对象。格森

Groups groups = gson.fromJson(jsonExmple, Groups.class);

注意事项:

  • 当JSON对象变大时,可以扩展组/组类并添加更多变量。请记住,您需要在反序列化器类中反映所有内容。:)
 类似资料:
  • 问题内容: 像这样转换JSON代码的最佳方法是什么: 在Java Map中,其中一个键为(field1,field2),而这些字段的值为(value1,value2)。 有任何想法吗?我应该使用Json-lib吗?或者,如果我编写自己的解析器会更好? 问题答案: 我希望您在开玩笑编写自己的解析器。:-) 对于这种简单的映射,http://json.org(java部分)中的大多数工具都可以使用。对

  • 问题内容: 像这样转换JSON代码的最佳方法是什么: 在Java Map中,其中一个键为(field1,field2),而这些字段的值为(value1,value2)。 有任何想法吗?我应该使用Json-lib吗?或者,如果我编写自己的解析器会更好? 问题答案: 我希望你在开玩笑地编写自己的解析器。: 对于这样的简单映射,http://json.org(java部分)中的大多数工具都可以使用。对于

  • 问题内容: 我需要知道如何将动态python对象转换为JSON。该对象必须能够具有多个级别的对象子对象。例如: 使用python 2.6的以下代码: 产生以下错误: 我不知道用户可能放入哪种子对象。是否有足够聪明的解决方案来检测属性是否是对象并自动对其进行解析? 更新 为在上包含子对象。 问题答案: 指定参数(doc):

  • 问题内容: 我在Aurelia应用程序中使用硬编码的类来表示模型。这是一个模型“ PostEdit”: 该对象被操纵后,我需要和它回服务器。但看起来的正在发送一个空字符串()。研究一下,将ES6类转换为时似乎被忽略了。 如何将我所有的属性都放入一个字符串中以提交回服务器? 问题答案: 我假设您正在使用符号来使数据保持私有,但这意味着如果要将数据包含在JSON表示中,则必须经过一些额外的步骤。 这是

  • 问题内容: 如果我做类似的事情: 那么它只会打印出约会数据,而不是相关的职员数据。如果我执行result [0] .staff.inpsect,那么我当然会得到人员数据。 问题是我想将它作为JSON(包括人员行)返回给AJAX。如何强制它包含人员行,还是必须遍历并手动创建内容? 问题答案: 是一种说法,没有。您需要在控制器中执行以下操作: 您需要在“约会”和“职员”之间建立关联才能正常工作。

  • 问题内容: 我认为以下内容将是一项非常常见的任务,并认为将有一个简单的解决方案,但我找不到。 如果我有以下结构的数据表。 我想将其序列化为JSON对象,其中ID列是JSON对象中的一个节点,例如: 我调查了JSON.NET,但无法正常工作。编辑:我正在使用C# 问题答案: 使用JSON.NET,这非常简单。只需将您的数据表转换成等效的字典词典: 然后致电: 这是完整的测试: 结果: