在JavaScript中搜索Json

在JavaScript中搜索Json,javascript,json,Javascript,Json,我有一个Json,其中包含文件夹和文件的层次结构 我试图通过文件夹Id获取文件夹及其子文件夹中的文件数 这里是json var jsonStr = { "hierarchy": { "date": "2014/09/24 15:21:23", "folder": { "name": "Root", "id": "Root", "file": [{ "id

我有一个Json,其中包含文件夹和文件的层次结构 我试图通过文件夹Id获取文件夹及其子文件夹中的文件数 这里是json

var jsonStr = {
    "hierarchy": {
        "date": "2014/09/24 15:21:23",
        "folder": {
            "name": "Root",
            "id": "Root",
            "file": [{
                "id": "22U2621210__PIN_検査報告書Ver1.0_20140923162232.xls"
            }, {
                "id": "C22-1(EU仕様)_20140923162409.xlsx"
            }, {
                "id": "Machine_Inspection_20140923162329.xlsx"
            }],
            "folder": {
                "name": "Level-1",
                "id": "1411396172645",
                "file": {
                    "id": "22U2621210__PIN_検査報告書Ver1.0_20140923162232.xls"
                },
                "folder": {
                    "name": "123",
                    "id": "1411538469568",
                    "file": [{
                        "id": "C22-1(EU仕様)_20140923162409.xlsx"
                    }, {
                        "id": "Machine_Inspection_20140923162329.xlsx"
                    }]
                }
            }
        }
    }
};
如果要通过使用特定文件夹及其子文件夹的id进行搜索来获取该文件夹及其子文件夹中的文件数,则所有文件夹都具有名称和id 例如,如果我放置文件夹
名称“123”
id“1411538469568”
,它应该只给我2个文件,它们是
“C22-1(EU仕様)_20140923162409.xlsx“
机器检查\u 20140923162329.xlsx”
但是如果我把
文件夹名“Root”
和i
d=“Root”
放进去,它应该会返回我所有文件的id


这是我正在处理的小提琴

您可以使用definant.js

下面是一个用于具体搜索场景的提琴,用于提取ID:root和Name:root的元素的文件ID:。在本例中,我使用的是Deviant.js:

Deviant.js优于@Cheery在答案中的自定义搜索,要获得文件的ID,我必须使用一行代码:

var ids = JSON.search(json,  "//*[name = 'Root' and id = 'Root']/file/id");
搜索动态数据时不太容易出错。Defiant.js使用XPath表达式。查看此链接了解更多信息:

以下是一些其他选项:

  • 可以使用普通JQuery

  • 您可以使用JsonPath。它类似于JSON文件的XPath。您可以执行以下操作:

    $..folder.file
    

  • 您可以使用Json查询。它有自己的深层查询语言。例如:

    风险值数据={ 小组成员:{ “朋友们”:[ {姓名:'Steve',国家:'NZ'}, {姓名:'Bob',国家:'US'} ], “敌人”:[ {名字:'邪恶的史蒂夫',国家:'AU'} ] } }

  • 如果您不喜欢这里的任何一项,您可以找到更多选项:

    您可以使用definant.js

    下面是一个用于具体搜索场景的提琴,用于提取ID:root和Name:root的元素的文件ID:。在本例中,我使用的是Deviant.js:

    Deviant.js优于@Cheery在答案中的自定义搜索,要获得文件的ID,我必须使用一行代码:

    var ids = JSON.search(json,  "//*[name = 'Root' and id = 'Root']/file/id");
    
    搜索动态数据时不太容易出错。Defiant.js使用XPath表达式。查看此链接了解更多信息:

    以下是一些其他选项:

  • 可以使用普通JQuery

  • 您可以使用JsonPath。它类似于JSON文件的XPath。您可以执行以下操作:

    $..folder.file
    

  • 您可以使用Json查询。它有自己的深层查询语言。例如:

    风险值数据={ 小组成员:{ “朋友们”:[ {姓名:'Steve',国家:'NZ'}, {姓名:'Bob',国家:'US'} ], “敌人”:[ {名字:'邪恶的史蒂夫',国家:'AU'} ] } }

  • 如果您不喜欢这里的任何一项,您可以找到更多选项:

    这不是最好的解决方案(对不起,4am),而是通过递归的直接方法。。 在正常情况下,您的结构不支持相同级别的文件夹,因此我对其进行了重新配置,并为其编写了代码:

    旧代码不起作用,所以我为您的新varia重写了它

    这不是一个最好的(对不起,4am)解决方案,而是通过递归的直接方法。。 在正常情况下,您的结构不支持相同级别的文件夹,因此我对其进行了重新配置,并为其编写了代码:

    旧代码不起作用,所以我为您的新varia重写了它



    显然,循环所有这些内容会得到你想要的。但这不是很有效。我认为你需要一个不同的结构,这样你就可以直接访问
    根目录
    ,以及同一级别上的子文件夹,但要参考它们的“父文件夹”。简单地说,`jsonStr'不是JSON,它是一个JavaScript对象。显然,循环所有his会让你得到你想要的。但这不是很有效。我认为你需要一个不同的结构,这样你就可以直接访问
    根目录
    ,以及同一级别上的子文件夹,但要参考它们的“父文件夹”。只需简单说明一下,`jsonStr'不是JSON,它是一个JavaScript对象。你的答案包含了非常好的信息,但我的问题是t我有一个多级文件夹和子文件夹层次结构,我从不确定我是否需要检查hierarchy.folder.file或hierarchy.folder.folder.file等等。这个json是动态创建的,我从不确定它的级别。如果是这样的话,我将使用no.4。Deviant.jsI添加了一个如何使用Deviant搜索具体结构的示例.jsYour answers包含极好的信息,但我的问题是,我有一个多级文件夹和子文件夹层次结构,我从不确定是否需要检查hierarchy.folder.file或hierarchy.folder.folder.file等。此json是动态创建的,我从不确定其级别。如果是这样,我将使用no.4。违抗。jsI添加了n示例如何使用Defiant搜索混凝土结构。js@AdilWaqar您的结构没有假定一个文件夹中有几个相同级别的文件夹?因为“文件夹”属性没有文件夹数组。请看一下这个小提琴,我已经重新生成了层次结构,现在它不工作@AdilWaqar我创建了一个更好的层次结构(对于一个文件夹中的几个文件夹)并为其编写了一个脚本-@AdilWaqar这是针对您当前的变体-抱歉,我必须睡觉)@AdilWaqar您的结构没有假定一个文件夹中有几个相同级别的文件夹?因为“folder”属性没有文件夹数组。请看一下这把小提琴,我已经重新生成了层次结构,它现在不工作@AdilWaqar我创建了一个更好的层次结构(对于一个文件夹中的几个文件夹)并为其编写了一个脚本-@AdilWaqar这是为您当前的变体编写的-抱歉,我必须睡觉)
    function getFiles(id)
    {
     var stp = -1;
     var files = searchFolders(jsonStr.hierarchy, false);
     alert('Found ' + files.length + " files\n" + JSON.stringify(files));
    
     function searchFolders(tree, count_files)
     {
         var data = [];  
         var folders = tree.folder.length > 1 ? tree.folder : [tree.folder];
         $.each(folders, function(key, val) {  
            var into = !count_files ? val.id == id : count_files;
    
             if (val.file && into)
                $.merge(data, getFiles(val.file));
    
             if (val.folder)
                $.merge(data, searchFolders(val, into));  
        });
        return data;
     }
    
     function getFiles(tree)
     { 
        var files = [];
        if (tree.id) return [tree.id]; 
        $.each(tree, function(key,val) {
           if (val.id)
              files.push(val.id);
        });
        return files;
     };
    }
    
    
    var jsonStr= {"hierarchy":{"date":"2014/09/24 18:13:00","folder":{"name":"Root","id":"Root","file":[{"id":"file.1"},{"id":"file.2"},{"id":"file.3"}],"folder":[{"name":"Level-1","id":"1411396172645","file":{"id":"file.4"},"folder":{"name":"123","id":"1411538469568","file":[{"id":"file.5"},{"id":"file.6"}],"folder":{"name":"123-a","id":"1411549962260","file":{"id":"file.7"}}}},{"name":"level-2","id":"1411549976987","file":{"id":"file.8"}}]}}};