如何使用Retrofit解析未知键的JSON?

4

我希望用Retrofit解析这个JSON(不知道字段名{xxx,yyy,zzz}) 我尝试过一些Maps,但是我做错了什么。 请帮助我解析这个该死的json。

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

---解决方案---

我尝试创建一个名为“responce”的类,但这是错误的做法。

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

我试了一下,它有效了。

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

2
有一天我也遇到了类似的任务。不确定我的解决方案是否完美,但它可能会对你有所帮助。
我有这个json文件: Json screenshot
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 为什么?获取字符串响应并重新解析它。 - Anton Shkurenko
@njzk2 Gson包中的JsonArray.java也提供了自定义反序列化器的相同功能。我认为如果没有自定义反序列化器,你无法很好地管理它,只需创建映射并遍历键即可。 - Anton Shkurenko
在大多数情况下,Retrofit 使用对象映射器(通常是 Gson),因此您不必自己处理响应的实际主体。 - njzk2
是的,使用自定义反序列化器来实现您在此建议的操作是有意义的。 - njzk2
@njzk2,目前在Gson的JsonElement中还没有遍历键的方法。 - Anton Shkurenko
这是有道理的,因为 JsonElement 不一定是 JsonObject。然而在 JsonObject 中,有一种方法可以对条目进行迭代。 - njzk2

-4

使用类似GsonFormat(Android studio插件)的工具,这是映射您的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是动态值,这个解决方案无法帮助。 - MrKosherno
OP在问题中说:“我不知道字段名称”。 - njzk2
我将“i don't know field names{xxx,yyy,zzz}”解释为“一些固定的值,我不知道它们的名称”。 - 1911z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接