3

我是使用 JSON 和 getJSON 函数等的新手,我正在尝试从 JSON 中获取数据,该 JSON 下降了几个级别并且可以有多个孩子。此刻,我可以通过将 .each 与另一个 .each 一起使用来查看我想要的值,例如:

$.each(data, function(i, value1) {
    $.each(value1, function(i, value2) {
        $.each(value2, function(i, value3) {
            $.each(value3, function(i, value4) {
                $.each(value4, function(i, value5) {
                    $.each(value5, function(i, value6) {
                        alert ("we got "+i);
                    });

唯一的问题是,我并不总是知道 JSON 中有什么,它可能有无限的孩子​​。那么我将如何让它成为动态的呢?

基本上我正在寻找的是不断检查孩子的东西,直到它达到最低水平。

另外,我知道最后的值 i 是 JSON 中任何值的索引,

有什么方法可以自动执行此操作,以便我可以检查 JSON 中的“名称”并返回“名称”的值?

这是我正在尝试使用的 JSON 示例:

[
 {
   "children": [
    {
      "children": [
       {
        "children": [
          {
            "children": [
              {
                "bucketPath": "AUDIO\\audio0.mp3",
                "id": 305,
                "modified": "2012-08-02T10:06:52",
                "name": "audio0.mp3",
                "state": "closed"
              }
4

3 回答 3

9

使用递归:

function recurse(name, obj) {
    if (!obj || typeof obj != "object")
        alert("found leaf '"+name+"': "+obj);
    else
        $.each(obj, recurse);
}
recurse("root", data);

编辑:根据您的 JSON,可以使其更具体:

function recurse(arr) {
   for (var i=0; i<arr.length; i++)
       for (var prop in arr[i])
           if (prop == "children") // && arr[i].children instanceof Array
               recurse(arr[i].children);
           else
               alert("we got "+prop+": "+arr[i][prop]);
}
recurse(data);
于 2012-08-29T13:33:35.363 回答
3

这听起来像是需要JPathJSONPath

var name = jpath(data, '//name');
于 2012-08-29T13:32:34.473 回答
0

当 JSON 变得像这样有点复杂时,我认为 dojo 的 JSONQuery 是一个很好的解决方案。如果您熟悉它,它类似于 XPath。查询可能会变得相当复杂,但这里有一个查询示例,用于在任意深度搜索具有给定名称的属性:

var results = dojox.json.query("..property_name", json_data);

这里有一篇很好的文章详细介绍了 dojo 的 JSONQuery 的使用:http ://www.sitepen.com/blog/2008/07/16/jsonquery-data-querying-beyond-jsonpath/

于 2012-08-29T13:35:50.167 回答