代码之家  ›  专栏  ›  技术社区  ›  Thomas Vos Jaydev Mehta

改装2:将具有动态键的JSON转换为映射,模型也包含这些键

  •  2
  • Thomas Vos Jaydev Mehta  · 技术社区  · 8 年前

    {
        "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数据,因此无法将其更改为其他格式。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Avi Levin    8 年前

    步骤A-创建组类:

    public class Group {
        String name;
        String type;
    }
    

    步骤B-创建groups类:

    public class Groups {
        List<Group> userList;
    }
    

    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键不同时,请使用@SerializedName注释