Поиск объектов 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);

Работающая скрипка для тебя на том же.

http://jsfiddle.net/3EVE4/

Другие вопросы по тегам