Java 如何在Android中解析嵌套的JSON对象?

Java 如何在Android中解析嵌套的JSON对象?,java,android,json,Java,Android,Json,我必须以如下结构解析Web服务返回的JSON字符串: { "catList" : { "1" :{ "name" : "NAME", "qty" : "QTY", "groupList" : { "40" : { "name" : "NAME", "qty" : "QTY", "subjectList" : { "1" : { "name" : "NAME",

我必须以如下结构解析Web服务返回的JSON字符串:

{
"catList" : {
"1" :{
    "name" : "NAME",
    "qty" : "QTY",
    "groupList" : {
        "40" : {
        "name" : "NAME",
        "qty" : "QTY",
        "subjectList" : {
            "1" : {
            "name" : "NAME",
            "qty" : "QTY",
            },
            "5" : {
            "name" : "NAME",
            "qty" : "QTY",
            },
            ...
        },
        "45" : {
        "name" : "NAME",
        "qty" : "QTY",
        "subjectList" : {
            "23" : {
            "name" : "NAME",
            "qty" : "QTY",
            },
            "45" : {
            "name" : "NAME",
            "qty" : "QTY",
            },
            ...
        },
        ...
"2" :{
    "name" : "NAME",
    "qty" : "QTY",
    "groupList" : {
        "142" : {
        "name" : "NAME",
        "qty" : "QTY",
        "subjectList" : {
            "86" : {
            "name" : "NAME",
            "qty" : "QTY",
            },
        "23" : {
        "name" : "NAME",
        "qty" : "QTY",
            },
            ...
        },
        "7" : {
        "name" : "NAME",
        "qty" : "QTY",
        "subjectList" : {
            "98" : {
            "name" : "NAME"
            "qty" : "QTY"
            },
            "08" : {
            "name" : "NAME"
            "qty" : "QTY"
            }
        },
        ...
    },
    ...
"3" :{SAME OTHERS},
"4" :{SAME OTHERS},
"5" :{SAME OTHERS},
"6" :{SAME OTHERS},
"7" :{SAME OTHERS},
"8" :{SAME OTHERS},
"9" :{SAME OTHERS},
}
我不知道怎么做?!我有一些类似的课程:

public class CatList {

    private String name;
    private String qty;
    private JSONObject groupList;
}

public class GroupList {

    private String name;
    private String qty;
    private JSONObject subjectList;
}

public class SubjectList {

    private String name;
    private String qty;
}
但由于群组列表和主题列表都有随机标题,我不知道如何识别它们。 这可能吗?我该怎么办?请帮助您了解该项目


我在web应用程序中使用此库,它可能适用于您的情况。

我建议您更改服务器返回的JSON结构,因为这是一种糟糕的设计:)

无论如何,这里是我使用Jackson库的工作示例。 示例json位于此处: 注意,我已经删除了“catList”,只留下了类别列表(参见json)

Category.java:

public class Category {

    private String name;
    private String qty;
    private Map<String, Group> groupList;

    @JsonProperty("groupList")
    public Map<String, Group> getGroupList() {
        return groupList;
    }

    @JsonProperty("groupList")
    public void setGroupList(Map<String, Group> groupList) {
        this.groupList = groupList;
    }

    @JsonProperty("name")
    public String getName() {
        return name;
    }

    @JsonProperty("name")
    public void setName(String name) {
        this.name = name;
    }

    @JsonProperty("qty")
    public String getQty() {
        return qty;
    }

    @JsonProperty("qty")
    public void setQty(String qty) {
        this.qty = qty;
    }
}
将JSON编组到我们的对象:

try {
    ObjectMapper om = new ObjectMapper();
    Map<String, Category> catMap = om.readValue(getAssets().open("json_test.json"), new TypeReference<Map<String, Category>>() {
    });
} catch (IOException e) {
    e.printStackTrace();
}
试试看{
ObjectMapper om=新的ObjectMapper();
Map catMap=om.readValue(getAssets().open(“json_test.json”),new TypeReference(){
});
}捕获(IOE异常){
e、 printStackTrace();
}

因此,您将获得Map对象。

我建议您在项目中使用Jackson,并为您试图反序列化的JSON创建一个类类型。

如果您遍历JSON对象数组,并使用getName()方法获取名称?或者,也可以使用库?

我将在这里发布这个答案,以便它清晰明了,不会隐藏在评论部分

JSONObject jsonObject = search.getJSONObject("object_key");
Iterator jsonObjectKeys = jsonObject.keys();

while(jsonObjectKeys.hasNext()) {
    String currentDynamicKey = (String)keys.next();
    JSONObject currentDynamicValue = jsonObject.getJSONObject(currentDynamicKey);

    //do what you need to do with the data here
}

因为和而使用。

你说分组列表和主题列表有随机标题是什么意思?与中一样,JSON键发生了变化?因为这会是一种奇怪的行为。这里有很多关于如何执行解析的答案:是的,这确实很奇怪。我的建议与下面的阿加莫夫相同。来自服务器的JSON数据应该是一致的,并遵循单一的、一致的设计。@jackgris我知道如何解析JSON,但在这种情况下,我很困惑。请参考以下答案:虽然我觉得有点混乱,但不幸的是,我认为这是您唯一的选择。不幸的是,我无法控制它你确定你有这种json响应吗?这是一个带有嵌套对象的大型对象,带有嵌套对象的嵌套对象:)最好将catlist设置为cats数组,将grouplist设置为Group数组,将subjectlist设置为subjects数组。感谢您抽出时间,我将尝试使用它
try {
    ObjectMapper om = new ObjectMapper();
    Map<String, Category> catMap = om.readValue(getAssets().open("json_test.json"), new TypeReference<Map<String, Category>>() {
    });
} catch (IOException e) {
    e.printStackTrace();
}
JSONObject jsonObject = search.getJSONObject("object_key");
Iterator jsonObjectKeys = jsonObject.keys();

while(jsonObjectKeys.hasNext()) {
    String currentDynamicKey = (String)keys.next();
    JSONObject currentDynamicValue = jsonObject.getJSONObject(currentDynamicKey);

    //do what you need to do with the data here
}