android - 如何在改造 2 中解析动态内部内部长度数组响应
问题描述
json
在解析响应时,我沉迷于一个奇怪的问题retrofit2
。实际上我有一个父类别,它有不同的子类别,可以变化(动态)不固定。一个父类别有 2 个子类别,而另一个有 5 个或可能是 1 个子类别。因此,这方面的回应正在到来。
我正在使用改造和gson
库来获取json
响应。
下面是一些我已经使用过的代码片段
public class CategoryDetails {
@SerializedName("icon")
@Expose
private String icon;
@SerializedName("childs")
@Expose
private List<ChildCategoryDetail> childList;
@SerializedName("categories_id")
@Expose
private String id;
@SerializedName("image")
@Expose
private String image;
@SerializedName("categories_name")
@Expose
private String name;
@SerializedName("parent_id")
@Expose
private String parentId;
@SerializedName("total_products")
@Expose
private String totalProducts;
public String getTotalProducts() {
return totalProducts;
}
public void setTotalProducts(String totalProducts) {
this.totalProducts = totalProducts;
}
public List<ChildCategoryDetail> getChildList() {
return childList;
}
public void setChildList(List<ChildCategoryDetail> childList) {
this.childList = childList;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
}
而对于它的子类别
public class ChildCategoryDetail {
@SerializedName("icon")
@Expose
private String icon;
@SerializedName("categories_id")
@Expose
private String id;
@SerializedName("image")
@Expose
private String image;
@SerializedName("categories_name")
@Expose
private String name;
@SerializedName("parent_id")
@Expose
private String parentId;
@SerializedName("total_products")
@Expose
private String totalProducts;
public String getTotalProducts() {
return totalProducts;
}
public void setTotalProducts(String totalProducts) {
this.totalProducts = totalProducts;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
}
以及我在下面使用它的逻辑
// Get CategoriesList from AppContext
allCategoriesList = ((App) getContext().getApplicationContext()).getCategoriesList();
int size = allCategoriesList.size();
allSubCategoriesList = new ArrayList<>();
// Get SubCategoriesList from AllCategoriesList
for (int i=0; i<allCategoriesList.size(); i++) {
int sizeStr = allCategoriesList.get(i).getChildList().size();
for (int j=0;j<allCategoriesList.get(i).getChildList().size();j++) {
allSubCategoriesList.add(allCategoriesList.get(i).getChildList().get(j));
}
}
从上面的逻辑只有我可以通过子类别的第一级而不是内部的第二级或第三级等等......
那么json是
{
"success": "1",
"data": [
{
"categories_id": 3,
"categories_name": "Boy's Clothing",
"parent_id": 0,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 3,
"total_products": 16,
"childs": [
{
"categories_id": 22,
"categories_name": "Boy Polo shirts",
"parent_id": 3,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 4,
"total_products": 4,
"childs": [
{
"categories_id": 48,
"categories_name": "Boy Polo Shirts sub-1",
"parent_id": 22,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/fyprD03510.png",
"vendors_id": 5,
"total_products": 0
},
{
"categories_id": 49,
"categories_name": "Boy Polo Shirts sub-2",
"parent_id": 22,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/fyprD03510.png",
"vendors_id": 5,
"total_products": 0
}
]
},
{
"categories_id": 23,
"categories_name": "Boy Casual Shirts",
"parent_id": 3,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 4,
"total_products": 5
},
{
"categories_id": 24,
"categories_name": "Boy Pants & Jeans",
"parent_id": 3,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 4,
"total_products": 4
},
{
"categories_id": 25,
"categories_name": "Boy Shoes",
"parent_id": 3,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 4,
"total_products": 3
}
]
},
{
"categories_id": 4,
"categories_name": "Girl's Clothing",
"parent_id": 0,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 3,
"total_products": 6,
"childs": [
{
"categories_id": 26,
"categories_name": "Dresses & Rompers",
"parent_id": 4,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 4,
"total_products": 3
},
{
"categories_id": 27,
"categories_name": "Shorts & Skirts",
"parent_id": 4,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 4,
"total_products": 3
},
{
"categories_id": 28,
"categories_name": "Sweaters",
"parent_id": 4,
"image": "images/media/2019/07/yvWJL03110.png",
"icon": "images/media/2019/07/yvWJL03110.png",
"vendors_id": 4,
"total_products": 0
}
]
}
],
"message": "Returned all categories.",
"categories": 2
}
我想进入所有内部级别,我也希望产品针对与 category_id 关联的类别
解决方案
试试这个伪代码
void main() {
ArrayList<Object> mainChilds = new ArrayList<Object>();
/* Replace Object with your pojo */
ArrayList<Object> allSubCategoriesList = new ArrayList<>();
allSubCategoriesList.addAll(getSubChilds(mainChilds));
}
ArrayList<Object> getSubChilds(ArrayList<Object> childs){
/* Replace Object with your pojo */
ArrayList<Object> subChilds = new ArrayList<>();
// Get SubCategoriesList from AllCategoriesList
for (int i = 0; i < childs.size(); i++) {
//// add the Child to the list is you want
subChilds.add(childs.get(i));
/// check the is there are subChilds exists or not
if(childs.get(i).getSubChilds().size > 0) {
///// pass those subchilds to function
subChilds.addAll(getSubChilds(childs.get(i).getSubChilds()));
}
}
return subChilds;
}
推荐阅读
- google-maps - 如何在谷歌地图 Ionic 3 上删除多边形
- matlab - 如何在 Matlab 2018 断点后继续执行?
- vaadin - HasUrlParameter#setParameter 中的 Vaadin Flow 重新路由不会更改 URL?
- javascript - 未捕获的类型错误:无法读取 React 中未定义的属性“名称”
- docker - 使用 docker-compose build 时在 x 秒内重试?
- angularjs - 堆叠在 2 列或 1 列中的可变高度的 md 卡
- angularjs - 在 Interceptor 错误地调用 successCallback 之后使用 $promise.then()
- ios - 将单元格高度固定到 UICollectionView 高度
- reporting-services - SSRS 2015 - 根据数据集表中的值和行组值隐藏 tablix 列
- java - 重要补丁更新咨询中的 Java“受影响的受支持版本”列