如何通过 Retrofit 解析带有未知键的 json?
Posted
技术标签:
【中文标题】如何通过 Retrofit 解析带有未知键的 json?【英文标题】:How to parse json with unknown key by Retrofit? 【发布时间】: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);
【问题讨论】:
【参考方案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”解释为“一些我不知道的固定值”。以上是关于如何通过 Retrofit 解析带有未知键的 json?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Android上通过retrofit2调用带有Cognito Credentials的API网关?
Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析
Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析