首页 > 解决方案 > 如何在改造 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 关联的类别

标签: androidjsongsonretrofit2

解决方案


试试这个伪代码

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;
}

推荐阅读