解析嵌套的 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?