解析嵌套的 JSONArray 并以 Recyclerview 正确的方式显示它

Posted

技术标签:

【中文标题】解析嵌套的 JSONArray 并以 Recyclerview 正确的方式显示它【英文标题】:Parse Nested JSONArray and show it in Recyclerview Proper way 【发布时间】:2021-05-13 06:43:55 【问题描述】:

我正在尝试使用 Gson 解析嵌套的 JSON 数组并在 recyclerview 中显示该数组。我解析 JSON 数组的方式对我来说似乎不太好/不合适,但它可以完成这项工作。但是我想知道如何正确处理这种情况。

示例 JSONArray

            
             "Status":"success",
             "Response":[
                    
                         "Title":"First Title",
                         "Code":"20210209",
                         "Content":[
                                
                                     "field_1":"field_1_text",
                                     "field_2":true
                                ,
                                
                                     "field_1":"field_1_text",
                                     "field_2":true
                                
                         ]
                    ,
                    
                         "Title":"Second Title",
                         "Code":"2021020902",
                         "Content":[
                                
                                     "field_1":"field_1_text_2",
                                     "field_2":true
                                ,
                                
                                     "field_1":"field_1_text_2",
                                     "field_2":false
                                
                         ]
                    
             ]
        

使用 Gson 解析(仅关注 Response 数组):

         List<ResponseArrayObject> responseList = new ArrayList<>();
         Type listType = new TypeToken<ArrayList<ResponseArrayObject>>().getType();
         responseList.addAll(new Gson().fromJson(response.toString(), listType));

到此为止,我正在一个主列表中解析完整的ResponseArray。在此之后,我使用 Getter/Setter 创建了一个新的 List of different objecttype 并遍历 responseList,如果 Content.size() 大于 0,我将执行以下操作。

        for(ResponseArrayObject responseO:responseList)
        if(responseO.Content.size()>0)
           CustomResponseList.add(new CustomerResponse(responseO.Title,null));
           for(Response.Content c:responseO.Content)
              CustomResponseList.add(new CustomerResponse(null,c));
           
        
    

这样我得到一个包含不同类型数据的列表,即

            [
            
            "Title" : "First Title",
            "Content" : null;
            ,
            "Title" : null,
            "Content" : 
            "field_1": "field_1_text",
            "field_2": true
            ,
            
            "Title" : "null",
            "Content" : 
            "field_1": "field_1_text",
            "field_2": true
            ,
            "Title" : "Second Title",
            "Content" : null;
            ,
            "Title" : "null",
            "Content" : 
            "field_1": "field_1_text_2",
            "field_2": true
            ,
            
            "Title" : "null",
            "Content" : 
            "field_1": "field_1_text_2",
            "field_2": true
            
            
            ]

现在这是一个带有nested OBJECT 的简单数组,我可以在recycerlview adapter 中简单地迭代这个数组,没有任何问题,并使用不同的布局配置based on null value

但我觉得这不是正确的方法。请有人调查一下并告诉我如何正确地做到这一点。

这里的很多链接基本上都是解析嵌套数组,我可以很容易地做到这一点,但没有人谈论如何在 Recyclerview 适配器中使用解析的嵌套数组。

【问题讨论】:

在您的情况下,POJO 模型不适合 JSON 有效负载。看看similar question,我在这里展示了如何使用在线工具:jsonschema2pojo.org。在您的情况下,也取消选中:Include getters and setters 选项。它将为根JSON Object 生成一个包装类,其中包含Response 字段。 是的@MichałZiober,可能是模型不适合 JSON 有效负载,因为我在 SO 中将其写下来以供参考和理解。但我的主要问题是如何在 recyclerview 适配器中使用格式良好且解析良好的嵌套数组。 【参考方案1】:

你可以试试这样用吗

List<ResponseArrayObject> responseList = new ArrayList<>();
Type listType = new TypeToken<ArrayList<ResponseArrayObject>>().getType();
responseList.addAll(new Gson().fromJson(response.toString(), Type.class));

请查看answer,如果这对您有帮助,如果您可以分享 pojo 课程也会很有帮助。如果问题是由于一对多或多对一关系引起的,则可以使用@JsonIgnore 注释解决此类问题。

【讨论】:

我看不出您的答案 sn-p 与我在问题中提供的答案之间有任何区别。并且您建议的答案再次用于将 JSON 解析或反序列化为 java 对象。我需要了解如何在 recyclerview 适配器中实现嵌套的 Java Array listi。

以上是关于解析嵌套的 JSONArray 并以 Recyclerview 正确的方式显示它的主要内容,如果未能解决你的问题,请参考以下文章

如何解析字符串并返回嵌套数组?

无法使用改造解析对象内部 jsonarray 的 jsonarray?

解析 jsonarray 时出错

使用 JsonReader 解析时 JsonArray 或 JsonObject 为空

Gson解析JsonObject和JsonArray

Gson解析JsonObject和JsonArray