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

JSONPath или другой XPath, как утилита для JSON/Javascript; или JQuery JSON

Я смотрел на JSONPath, и хотя это выглядит довольно хорошо, мне интересно, кто-нибудь работал с ним и может прокомментировать его удобство использования или может порекомендовать альтернативы? Что было бы очень гладко, если бы был JQuery плагин, который сделал что-то вроде этого. Я искал плагины и подходил с пустыми руками. Во всяком случае, прежде чем я проведу время, узнаю JSONPath (у которого есть некоторые аспекты, которые я не увлекаюсь), или до того, как я изобретаю колеса, я думал, что посмотрю, есть ли у кого-то угол на этом...

Чтобы дать вам представление о том, что я имею в виду, представьте этот объект Javascript:

var Characters=[
        {
            id: "CuriousGeorge",
            species:"Monkey",
            mood: "curious",
            appendage: [
                { 
                    type: "hand",
                    side: "left",
                    holding: [ 
                        { id: "Banana" } 
                    ]
                },
                { 
                    type: "hand",
                    side: "right",
                    holding: []
                }, 
                { 
                    type: "foot",
                    side: "left",
                    holding: []
                },
                { 
                    type: "foot",
                    side: "right",
                    holding: [ 
                        { id: "YellowHat" },
                        { id: "Keys" }
                    ]
                }
            ]
        },
        {
            id: "ManInYellowHat",
            species: "Human",
            mood: "angry",
            //...ok, you get it...
        }
    ]

Не было бы здорово добраться до некоторых более глубоких объектов чем-то вроде селекторов JQuery?

var banana=SomeUtility("Characters holding #Banana").get(0);
var leftHands=SomeUtility("Characters appendage[type=hand][side=left]").get();

(Это может претендовать на пример самого сильного кода мира, но, эй, мои дети просто смотрели это. И я не могу использовать реальный пример из-за NDA...)

... И, чтобы сделать его более интересным, если бы я создал такое, кто-нибудь его использовал бы?

4b9b3361

Ответ 1

Отъезд JSON Select - селектор CSS для JSON.

Ответ 2

Определенно будет полезной утилитой.

Мое мнение таково, что наилучшим способом приблизиться к этому было бы как можно ближе к селекторам css, как вы указываете. Я бы рекомендовал посмотреть под капотом на jquery реализация селекторов.

Я бы предложил что-то вроде

var banana = object.function(jsonObect, "holding #Banana");
var leftHands = object.function(jsonObject, "appendage[type=hand][side=left]");

вместо ваших примеров использования.

Я не уверен, что предстоящая поддержка родного json повлияет на это...

Ответ 3

ОК, я создал прототип для этого, доступный здесь: http://code.google.com/p/jfunk/

Это уже зарекомендовало себя как полезное для меня, поэтому я, вероятно, постепенно улучшу его и переделаю во что-то приятное. Но если я получаю хорошие отзывы, я могу двигаться быстрее. Я также приветствую помощь.

Ответ 4

Попробуйте использовать JSPath - https://github.com/dfilatov/jspath.

JSPath - это доменный язык (DSL), который позволяет вам перемещаться и находить данные в ваших документах JSON. Используя JSPath, вы можете выбрать элементы JSON для извлечения данных, которые они содержат.

JSPath для JSON, как XPath для XML.

Ответ 5

Dojo dojo.getObject имеет средство, которое работает свободно как это, где вы можете указать путь, например "a.b.c", к свойству, которое вы хотите получить.

Проверьте это:

http://api.dojotoolkit.org/jsdoc/1.3/dojo.getObject

Я не думаю, что он хорошо разбирается в массивах, и я думаю, что отсутствует полнофункциональный язык селектора, такой как тот, который вы предлагаете.

Что касается использования, я кодировал язык селектора, такой как тот, который вы предлагаете, но для клиента и адресация массива очень проприетарны к их конкретной структуре объектов.

Я бы определенно использовал такую ​​систему, если бы вы ее сделали, и, возможно, даже помог, если бы увидел область, в которой я мог бы помочь.

Ответ 6

Я просто написал клиентскую JS-lib, которая делает именно это - это позволяет запросить структуру JSON с помощью XPath.

@jlarson - с "defiant.js", вы можете запросить структуру JSON следующим образом (этот lib расширяет глобальный объект JSON):

JSON.search( Characters, '//*[id="Banana"]' );



Этот вызов возвращает массив с соответствующими узлами, и эти совпадения не будут отделяться от исходного объекта JSON (такое же поведение, как при работе с XML + XPath). Чтобы проиллюстрировать, что я имею в виду, вот небольшой псевдо-код (-ish):

var store = {
    "book": [
        {
            "id": 1,
            "price": 8.95,
            "title": "Sayings of the Century",
            "category": "reference",
            "author": "Nigel Rees"
        },
        {
            "id": 2,
            "price": 22.99,
            "title": "The Lord of the Rings",
            "category": "fiction",
            "author": "J. R. R. Tolkien",
            "isbn": "0-395-19395-8"
         }
    ]
};

var b1 = JSON.search( store, '//book[1]' );
b1[0].isbn = '12345';

console.log( store.book[0].isbn );
// 12345

Эта библиотека до сих пор доступна для браузеров и клиентов, но я планирую переписать ее для NodeJS в конце концов. Посмотрите здесь оценщика Xpath; который демонстрирует функциональность. Существуют также предварительно написанные выражения Xpath:

http://defiantjs.com/#xpath_evaluator

Вы можете найти lib в Github:
https://github.com/hbi99/defiant.js

Наконец, в "defiant.js" есть немного больше функциональности, и если вам интересно, вы, надеюсь, прочтете об этом там (< а2 > )

Надеюсь, вы сочтете это полезным.

Ответ 7

Похоже, есть новый вариант: jQuery-JSONPath. Кажется, именно то, о чем вы просите.