【问题标题】:How to parse json with unknown key by Retrofit?如何通过 Retrofit 解析带有未知键的 json?
【发布时间】:2016-08-13 01:17:36
【问题描述】:

我想通过 Retrofit 解析这个 JSON(我不知道字段名{xxx,yyy,zzz}) 我尝试了一些地图,但我做错了。 请帮我解析这个该死的json

    {
        xxx: [
        {
        name: "name1",
        description: "desc1"
        }
        ],
        yyy: [
        {
        name: "name2",
        description: "desc2"
        }
        ],
        zzz: [
        {
        name: "name3",
        description: "desc3"
        },
{
        name: "name4",
        description: "desc4"
        }
        ]
        }

---解决方案---

我尝试创建类响应,但方法错误

public class DishesCategoryResponse {
    public Map<String, List<Dish>> settingsMap;
}

然后我尝试了这个并且它有效

@GET("/api/restaurant_menu/{id}")
    Observable<Map<String, List<Dish>>> getDishesCategory(@Path("id") long id);

【问题讨论】:

    标签: android json parsing retrofit


    【解决方案1】:

    有一天我有一个类似的任务。不确定我的解决方案是否完美,但它可能会对您有所帮助。

    我有这个 json 文件:

    final JSONObject bodyObject = new JSONObject(body);
    final JSONObject activities = bodyObject.getJSONObject("activities");
    final Iterator<String> keys = activities.keys(); // you can iterate through all keys
    
    final List<ContactActivity> contactActivityInfoList = new ArrayList<ContactActivity>();
    
    while (keys.hasNext()) {
        final String key = keys.next();
    
        final String jsonString = activities.getJSONObject(key).toString();
        final ContactActivity contactActivity =
                    mGson.fromJson(jsonString, ContactActivity.class);
    
        contactActivityInfoList.add(contactActivity);
    }
    

    【讨论】:

    • @njzk2 为什么?获取字符串响应并重新解析它
    • @njzk2 Gson 包中带有 JsonArray.java 的自定义反序列化器也可以使用相同的功能。我认为如果没有自定义反序列化器,您将无法很好地管理它,只需制作地图并遍历键
    • 在大多数情况下,改造使用对象映射器(通常是 gson),因此您不必自己处理响应的实际正文。
    • 是的,自定义反序列化器可以按照您在此处的建议进行操作。
    • @njzk2 没有办法遍历gson的JsonElement中的key
    【解决方案2】:

    使用像 GsonFormat (Android studio plugin) 这样的工具,这是映射您的 json 的类:

    public class YourClassName {
    
    /**
     * name : name1
     * description : desc1
     */
    
    private List<XxxEntity> xxx;
    /**
     * name : name2
     * description : desc2
     */
    
    private List<YyyEntity> yyy;
    /**
     * name : name3
     * description : desc3
     */
    
    private List<ZzzEntity> zzz;
    
    public void setXxx(List<XxxEntity> xxx) {
        this.xxx = xxx;
    }
    
    public void setYyy(List<YyyEntity> yyy) {
        this.yyy = yyy;
    }
    
    public void setZzz(List<ZzzEntity> zzz) {
        this.zzz = zzz;
    }
    
    public List<XxxEntity> getXxx() {
        return xxx;
    }
    
    public List<YyyEntity> getYyy() {
        return yyy;
    }
    
    public List<ZzzEntity> getZzz() {
        return zzz;
    }
    
    public static class XxxEntity {
        private String name;
        private String description;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public String getName() {
            return name;
        }
    
        public String getDescription() {
            return description;
        }
    }
    
    public static class YyyEntity {
        private String name;
        private String description;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public String getName() {
            return name;
        }
    
        public String getDescription() {
            return description;
        }
    }
    
    public static class ZzzEntity {
        private String name;
        private String description;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public String getName() {
            return name;
        }
    
        public String getDescription() {
            return description;
        }
    }
    }
    

    【讨论】:

    • 感谢插件,但在这种情况下,xxx,yyy,zzz 是动态值,此解决方案无济于事
    • OP 在问题中说“我不知道字段名称”
    • 我将“我不知道字段名称{xxx,yyy,zzz}”解释为“一些我不知道的固定值”。
    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2015-11-08
    相关资源
    最近更新 更多