如何通过 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?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Retrofit 解析带有对象数组的 JSON 数组

如何在Android上通过retrofit2调用带有Cognito Credentials的API网关?

Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析

Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析

Android – 使用带有 Jetpack Compose 的 Retrofit 库进行 JSON 解析

如何使用 vue.js 将多个带有键的值传递给 url