我有以下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"
}
]
}
}
]
答案 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);
同样适合你的小提琴。