使用JQuery搜索JSON对象

时间:2013-06-10 20:40:52

标签: javascript jquery json

我有以下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"
            }
        ]
    }
 }
]

3 个答案:

答案 0 :(得分: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

这个答案取自另一个主题。您可以在此处找到更多帮助:use jQuery's find() on JSON object

答案 1 :(得分:1)

使用DefiantJS(http://defiantjs.com)对JSON结构执行此类查询是微不足道的。此lib使用“搜索”方法扩展全局对象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

答案 2 :(得分: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/