Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果深度嵌套的JSON在java中有不确定的嵌套,我如何遍历它?_Java_Json - Fatal编程技术网

如果深度嵌套的JSON在java中有不确定的嵌套,我如何遍历它?

如果深度嵌套的JSON在java中有不确定的嵌套,我如何遍历它?,java,json,Java,Json,例如,我有以下JSON: { "field1": "value1", "field2: "value2", "array1" : [ "field1": "value1", "field2: "value2", "array1" : [ "field1": "value1",

例如,我有以下JSON:

{

        "field1": "value1",
        "field2: "value2",
        "array1" : [
                "field1": "value1",
                "field2: "value2",
                "array1" : [
                    "field1": "value1",
                    "field2: "value2",
                 ]
        ]

}
它可以有更多或嵌套在同一格式的内部,如何使用递归遍历它

好吧,看起来我有点困惑,json可能是上面的那个,或者像下面这个,在增加“巢穴”的过程中,比如那个俄罗斯娃娃:

{

        "field1": "value1",
        "field2: "value2",
        "array1" : [
                "field1": "value1",
                "field2: "value2",
                "array1" : [
                    "field1": "value1",
                    "field2: "value2",
                        "array1" : [
                            "field1": "value1",
                            "field2: "value2",
                     ]
                 ]
        ]

}

假设您使用Jackson或Gson,您可以定义一个POJO,您可以像其他任何对象一样解析和迭代它

public class Foo {
    String field1, field2;
    List<Foo> array1;

    public static void traverse(Foo f) {
        if (f.array1 == null) return;
        // do something for current object 
        for (Foo next : f.array1) traverse(next);
        // do something after visiting all children 
   } 
} 
公共类Foo{
字符串字段1,字段2;
列表1;
公共静态无效遍历(Foo f){
if(f.array1==null)返回;
//为当前对象执行某些操作
对于(Foo-next:f.array1)遍历(next);
//看完所有的孩子后做点什么
} 
} 
方法#0

将JSON转换为POJO并利用库,您可以从POJO迭代任何对象

方法#1

请不要重新发明轮子,因为有许多库是由许多贡献者创建和改进的

请利用

通过使用下面的代码,您可以访问下面这样的复杂json

您可以使用迭代器遍历下面的列表

// get first author 
String author0 = JsonPath.read(document, "$.store.book[0].author");

// get all titles 
List<String> titles = JsonPath.parse(JSON_DOCUMENT).read("$.store.book[*].title", typeRef);


您正在使用哪个json库?大多数人都有一种方法来检查一个值是对象还是arrayHi Cricket,我在库中使用的是org json?它还没有结束吗?或者它是一个正在增长的json?如果您的问题涉及不断增长的json,那么,在我看来,“json上的迭代”的观点是不正确的,您最好使用流APIinstead@forkdbloke,它结束了,我的意思是要处理的json可能有随机数的“嵌套”,这取决于发送给我的数据。因此,在这种情况下,我建议使用JSONPath(如我的答案中的方法#1所建议的),因为您需要对具有未知元素的结构化json进行随机访问,并且仍然能够进行迭代。这如何帮助访问无限深的数组?当你说无限时,你需要知道每个点的索引,你真正的意思是什么?它还没有结束吗?或者它是一个不断增长的json?我不确定。阅读问题。。。“它可能有更多或嵌套在同一格式的内部”如果您的问题涉及不断增长的json,那么,在我看来,“json上的迭代”的观点是不正确的,您最好使用流api。好吧,流api不会递归嵌套对象。它们必须被夷为一片
{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}