Поиск объектов JSON с помощью JQuery
У меня есть следующий объект 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 ответа
JQuery не работает с обычными объектными литералами. Вы можете использовать следующую функцию аналогичным образом для поиска всех идентификаторов (или любого другого свойства), независимо от его глубины в объекте:
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
Этот ответ взят из другой ветки. Вы можете найти больше помощи здесь: используйте jQuery's find() для объекта JSON
Выполнение такого рода запросов в структурах JSON тривиально с помощью DefiantJS ( http://defiantjs.com/). Эта библиотека расширяет глобальный объект 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
Кто-то еще, как уже ответил, так или иначе, вот моя версия для того же.
<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);
Работающая скрипка для тебя на том же.