1

我有以下 JSON 对象。使用 JQuery 我需要找到以下值:

summary.nameValues.ID 和 detail.TypedNameValues.size

有人可以展示如何使用 JQuery 来实现吗?

[
{
    "path": "\\Users\\john.smith\\test",
    "summary": {
        "NameValues": [
            {
                "Name": "Id",
                "Values": [
                    "232639"
                ]
            },
            {
                "Name": "City",
                "Values": [
                    "London"
                ]
            }
        ]
    },
    "detail": {
        "String": "some data",
        "Result": 0,
        "TypedNameValues": [
            {
                "Name": "name1",
                "Type": "string",
                "Value": "data here!!"
            },
            {
                "Name": "size",
                "Type": "long",
                "Value": "434353"
            }
        ]
    }
 }
]
4

3 回答 3

1

使用 DefiantJS ( http://defiantjs.com )对 JSON 结构执行这种查询是微不足道的。这个库使用“search”方法扩展了全局对象 JSON - 使用它可以执行 XPath 表达式搜索。

看看这个小提琴;
http://jsfiddle.net/hbi99/kLE2v/

代码可能如下所示:

var data = [
       {
          "path": "\\Users\\john.smith\\test",
          "summary": {
             "NameValues": [
                {
                   "Name": "Id",
                   "Values": "232639"
                },
                {
                   "Name": "City",
                   "Values": "London"
                }
             ]
          },
          "detail": {
             "String": "some data",
             "Result": 0,
             "TypedNameValues": [
                {
                   "Name": "name1",
                   "Type": "string",
                   "Value": "data here!!"
                },
                {
                   "Name": "size",
                   "Type": "long",
                   "Value": "434353"
                }
             ]
          }
       }
    ],
    res = JSON.search( data, '//*[Name="size"]' );

console.log( res[0].Value );
// 434353
于 2014-01-07T09:09:37.870 回答
1

jQuery 不适用于纯对象文字。您可以以类似的方式使用以下函数来搜索所有“id”(或任何其他属性),无论其在对象中的深度如何:

function getObjects(obj, key, val) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val));
        } else if (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}

像这样使用:

getObjects(TestObj, 'id', 'A'); // Returns an array of matching objects

这个答案取自另一个线程。您可以在这里找到更多帮助:在 JSON 对象上使用 jQuery 的 find()

于 2013-06-10T20:47:57.653 回答
0

已经回答的其他人,无论哪种方式,这里都是我的版本。

<textarea id="ta" style="display:none;">[
{
    "path": "\\Users\\john.smith\\test",
    "summary": {
        "NameValues": [
            {
                "Name": "Id",
                "Values": [
                    "232639"
                ]
            },
            {
                "Name": "City",
                "Values": [
                    "London"
                ]
            }
        ]
    },
    "detail": {
        "String": "some data",
        "Result": 0,
        "TypedNameValues": [
            {
                "Name": "name1",
                "Type": "string",
                "Value": "data here!!"
            },
            {
                "Name": "size",
                "Type": "long",
                "Value": "434353"
            }
        ]
    }
 }
]</textarea>

解析器

var obj = $.parseJSON($('#ta').val());
var nameValues = obj[0].summary.NameValues;
var typedNameValues = obj[0].detail.TypedNameValues;

function getObjByName(o, name) {
    for (var i = 0; i < o.length; i++) {
        if (o[i].Name == name) {
            return o[i];
        }
    }
    return null;
}

alert(getObjByName(nameValues, 'Id').Values.join(", "));
alert(getObjByName(typedNameValues, 'size').Value);

为您提供同样的工作小提琴。

http://jsfiddle.net/3EVE4/

于 2013-06-10T21:08:28.130 回答