JSONPath или другая XPath-подобная утилита для JSON / Javascript; или JQuery JSON - PullRequest
14 голосов
/ 13 мая 2009

Я смотрел на 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 ...)

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

Ответы [ 7 ]

6 голосов
/ 13 декабря 2011

Извлечение JSON Select - CSS-подобные селекторы для JSON.

4 голосов
/ 17 мая 2009

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

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

4 голосов
/ 14 мая 2009

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

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

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

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

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

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

3 голосов
/ 27 ноября 2012

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

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

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

2 голосов
/ 02 января 2014

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

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

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



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

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

Вы можете найти библиотеку на Github:
https://github.com/hbi99/defiant.js

Наконец, в "defiant.js" есть немного больше функциональности, и, если вам интересно, вы, вероятно, прочитаете об этом там (http://defiant.com)

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

2 голосов
/ 14 мая 2009

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

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

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

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

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

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

1 голос
/ 19 августа 2014

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

...