Подтвердить что ты не робот

Как искать дерево JSON с помощью jQuery

У меня есть вопрос о поиске JSON для конкретной информации. Например, у меня есть этот JSON файл:

 {
    "people": {
        "person": [
            {
                "name": "Peter",
                "age": 43,
                "sex": "male"
            }, {
                "name": "Zara",
                "age": 65,
                "sex": "female"
            }
        ]
    }
}

Мой вопрос в том, как можно найти конкретного человека по имени и показать возраст этого человека с помощью jQuery? Например, я хочу найти JSON для человека по имени Питер, и когда я нахожу совпадение, я хочу отобразить дополнительную информацию об этом матче (например, о человеке по имени Питер), например, о возрасте человека.

4b9b3361

Ответ 1

var json = {
    "people": {
        "person": [{
            "name": "Peter",
            "age": 43,
            "sex": "male"},
        {
            "name": "Zara",
            "age": 65,
            "sex": "female"}]
    }
};
$.each(json.people.person, function(i, v) {
    if (v.name == "Peter") {
        alert(v.age);
        return;
    }
});

Пример.

Основываясь на этом ответе, вы можете использовать что-то вроде:

$(function() {
    var json = {
        "people": {
            "person": [{
                "name": "Peter",
                "age": 43,
                "sex": "male"},
            {
                "name": "Zara",
                "age": 65,
                "sex": "female"}]
        }
    };
    $.each(json.people.person, function(i, v) {
        if (v.name.search(new RegExp(/peter/i)) != -1) {
            alert(v.age);
            return;
        }
    });
});

Пример 2

Ответ 2

Я нашел ifaour пример jQuery.each(), чтобы быть полезным, но добавил бы, что jQuery.each() может быть поврежден (то есть остановлен), возвращая false в точке, где вы нашли то, что вы поиск:

$.each(json.people.person, function(i, v) {
        if (v.name == "Peter") {
            // found it...
            alert(v.age);
            return false; // stops the loop
        }
});

Ответ 3

Вы можете использовать Jsel - https://github.com/dragonworx/jsel (для полного раскрытия, я являюсь владельцем этой библиотеки).

Он использует настоящий движок XPath и обладает широкими возможностями настройки. Работает как в Node.js, так и в браузере.

Учитывая ваш оригинальный вопрос, вы найдете людей по имени с:

// include or require jsel library (npm or browser)
var dom = jsel({
    "people": {
        "person": [{
            "name": "Peter",
            "age": 43,
            "sex": "male"},
        {
            "name": "Zara",
            "age": 65,
            "sex": "female"}]
    }
});
var person = dom.select("//person/*[@name='Peter']");
person.age === 43; // true

Если вы всегда работали с одной и той же схемой JSON, вы можете создать свою собственную схему с помощью jsel и иметь возможность использовать более короткие выражения, такие как:

dom.select("//person[@name='Peter']")

Ответ 4

Как только вы загрузите JSON в объект JavaScript, это уже не проблема jQuery, а теперь проблема JavaScript. В JavaScript вы можете, например, написать поиск, например:

var people = myJson["people"];
var persons = people["person"];
for(var i=0; i < persons.length; ++i) {
    var person_i = persons[i];
    if(person_i["name"] == mySearchForName) {
        // found ! do something with 'person_i'.
        break;
    }
}
// not found !

Ответ 5

Есть несколько js-библиотек, которые могли бы вам помочь:

Вы также можете взглянуть на Lawnchair, который является JSON-Document-Store который работает в браузере и имеет всевозможные механизмы запросов.

Ответ 6

Вы можете использовать DefiantJS (http://defiantjs.com), который расширяет глобальный объект JSON методом "поиск". С помощью которых вы можете запрашивать запросы XPath в структурах JSON. Пример:

var byId = function(s) {return document.getElementById(s);},
data = {
   "people": {
      "person": [
         {
            "name": "Peter",
            "age": 43,
            "sex": "male"
         },
         {
            "name": "Zara",
            "age": 65,
            "sex": "female"
         }
      ]
   }
},
res = JSON.search( data, '//person[name="Peter"]' );

byId('name').innerHTML = res[0].name;
byId('age').innerHTML = res[0].age;
byId('sex').innerHTML = res[0].sex;

Вот рабочая скрипка;
http://jsfiddle.net/hbi99/NhL7p/

Ответ 7

Вы можете искать в массиве объектов json, используя $.grep() следующим образом:

var persons = {
    "person": [
        {
            "name": "Peter",
            "age": 43,
            "sex": "male"
        }, {
            "name": "Zara",
            "age": 65,
            "sex": "female"
        }
      ]
   }
};
var result = $.grep(persons.person, function(element, index) {
   return (element.name === 'Peter');
});
alert(result[0].age);

Ответ 8

    var GDNUtils = {};

GDNUtils.loadJquery = function () {
    var checkjquery = window.jQuery && jQuery.fn && /^1\.[3-9]/.test(jQuery.fn.jquery);
    if (!checkjquery) {

        var theNewScript = document.createElement("script");
        theNewScript.type = "text/javascript";
        theNewScript.src = "http://code.jquery.com/jquery.min.js";

        document.getElementsByTagName("head")[0].appendChild(theNewScript);

        // jQuery MAY OR MAY NOT be loaded at this stage


    }
};



GDNUtils.searchJsonValue = function (jsonData, keytoSearch, valuetoSearch, keytoGet) {
    GDNUtils.loadJquery();
    alert('here' + jsonData.length.toString());
    GDNUtils.loadJquery();

    $.each(jsonData, function (i, v) {

        if (v[keytoSearch] == valuetoSearch) {
            alert(v[keytoGet].toString());

            return;
        }
    });



};




GDNUtils.searchJson = function (jsonData, keytoSearch, valuetoSearch) {
    GDNUtils.loadJquery();
    alert('here' + jsonData.length.toString());
    GDNUtils.loadJquery();
    var row;
    $.each(jsonData, function (i, v) {

        if (v[keytoSearch] == valuetoSearch) {


            row  = v;
        }
    });

    return row;



}

Ответ 9

У меня есть аналогичное условие плюс мой поисковый запрос, не ограничиваясь конкретным свойством Object (например, "John", поисковый запрос должен совпадать с first_name, а также с свойством last_name). Проведя несколько часов, я получил эту функцию от проекта Angular. Они позаботились обо всех возможных случаях.

/* Seach in Object */

var comparator = function(obj, text) {
if (obj && text && typeof obj === 'object' && typeof text === 'object') {
    for (var objKey in obj) {
        if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
                comparator(obj[objKey], text[objKey])) {
            return true;
        }
    }
    return false;
}
text = ('' + text).toLowerCase();
return ('' + obj).toLowerCase().indexOf(text) > -1;
};

var search = function(obj, text) {
if (typeof text == 'string' && text.charAt(0) === '!') {
    return !search(obj, text.substr(1));
}
switch (typeof obj) {
    case "boolean":
    case "number":
    case "string":
        return comparator(obj, text);
    case "object":
        switch (typeof text) {
            case "object":
                return comparator(obj, text);
            default:
                for (var objKey in obj) {
                    if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
                        return true;
                    }
                }
                break;
        }
        return false;
    case "array":
        for (var i = 0; i < obj.length; i++) {
            if (search(obj[i], text)) {
                return true;
            }
        }
        return false;
    default:
        return false;
}
};

Ответ 11

Вам не нужно использовать jQuery. Простой JavaScript будет работать. Я бы не рекомендовал какую-либо библиотеку, которая портирует XML-стандарты на JavaScript, и я был разочарован тем, что для этого не было другого решения, поэтому я написал свою собственную библиотеку.

Я адаптировал регулярное выражение для работы с JSON.

Сначала стягиваем объект JSON. Затем вам нужно сохранить начальные и длинные совпадающие подстроки. Например:

"matched".search("ch") // yields 3

Для строки JSON это работает точно так же (если вы явно не просматриваете запятые и фигурные скобки, в этом случае я рекомендовал бы некоторое предварительное преобразование вашего объекта JSON перед выполнением регулярного выражения (т.е. think:, {,}).

Затем вам нужно восстановить объект JSON. Алгоритм, который я создал, делает это, обнаруживая синтаксис JSON путем рекурсивного перехода назад из индекса соответствия. Например, псевдокод может выглядеть следующим образом:

find the next key preceding the match index, call this theKey
then find the number of all occurrences of this key preceding theKey, call this theNumber
using the number of occurrences of all keys with same name as theKey up to position of theKey, traverse the object until keys named theKey has been discovered theNumber times
return this object called parentChain

С помощью этой информации можно использовать регулярное выражение для фильтрации объекта JSON для возврата ключа, значения и родительской цепочки объектов.

Вы можете увидеть библиотеку и код, которые я написал в http://json.spiritway.co/