Ответ 1
Отъезд JSON Select - селектор CSS для 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...)
... И, чтобы сделать его более интересным, если бы я создал такое, кто-нибудь его использовал бы?
Отъезд JSON Select - селектор CSS для JSON.
Определенно будет полезной утилитой.
Мое мнение таково, что наилучшим способом приблизиться к этому было бы как можно ближе к селекторам css, как вы указываете. Я бы рекомендовал посмотреть под капотом на jquery реализация селекторов.
Я бы предложил что-то вроде
var banana = object.function(jsonObect, "holding #Banana");
var leftHands = object.function(jsonObject, "appendage[type=hand][side=left]");
вместо ваших примеров использования.
Я не уверен, что предстоящая поддержка родного json повлияет на это...
ОК, я создал прототип для этого, доступный здесь: http://code.google.com/p/jfunk/
Это уже зарекомендовало себя как полезное для меня, поэтому я, вероятно, постепенно улучшу его и переделаю во что-то приятное. Но если я получаю хорошие отзывы, я могу двигаться быстрее. Я также приветствую помощь.
Попробуйте использовать JSPath - https://github.com/dfilatov/jspath.
JSPath - это доменный язык (DSL), который позволяет вам перемещаться и находить данные в ваших документах JSON. Используя JSPath, вы можете выбрать элементы JSON для извлечения данных, которые они содержат.
JSPath для JSON, как XPath для XML.
Dojo dojo.getObject имеет средство, которое работает свободно как это, где вы можете указать путь, например "a.b.c", к свойству, которое вы хотите получить.
Проверьте это:
http://api.dojotoolkit.org/jsdoc/1.3/dojo.getObject
Я не думаю, что он хорошо разбирается в массивах, и я думаю, что отсутствует полнофункциональный язык селектора, такой как тот, который вы предлагаете.
Что касается использования, я кодировал язык селектора, такой как тот, который вы предлагаете, но для клиента и адресация массива очень проприетарны к их конкретной структуре объектов.
Я бы определенно использовал такую систему, если бы вы ее сделали, и, возможно, даже помог, если бы увидел область, в которой я мог бы помочь.
Я просто написал клиентскую 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 > )
Надеюсь, вы сочтете это полезным.
Похоже, есть новый вариант: jQuery-JSONPath. Кажется, именно то, о чем вы просите.