![](/img/trans.png)
[英]Transforming this JSON via underscore or a javascript utility library?
[英]JSONPath or other XPath like utility for JSON/Javascript; or 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();
(這可能符合世界上最老套的代碼示例,但是嘿,我的孩子們剛剛看了這個。由於保密協議,我不能使用真實示例......)
……而且,為了讓它更有趣,如果我要創造這樣的東西,會有人使用它嗎?
查看JSON Select - 用於 JSON 的類 CSS 選擇器。
絕對會是一個有用的實用程序。
我的觀點是,解決這個問題的最好方法是盡可能地與 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 項以檢索它們包含的數據。
JSON 的 JSPath 就像 XML 的 XPath。
我剛剛寫了一個客戶端 JS-lib 來完成這個 - 它可以使用 XPath 查詢 JSON 結構。
@jlarson - 使用“defiant.js”,你可以像這樣查詢你的 JSON 結構(這個庫擴展了全局 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
你可以在 Github 上找到這個庫:
https://github.com/hbi99/defiant.js
最后,“defiant.js” 中有更多功能,如果您有興趣,希望您可以閱讀那里的內容( http://defiant.com )
我希望你會發現它很有用。
Dojo 的 dojo.getObject 有一個像這樣松散工作的工具,您可以在其中提供一個像“abc”這樣的路徑到您想要獲取的屬性。
一探究竟:
http://api.dojotoolkit.org/jsdoc/1.3/dojo.getObject
我認為它不太了解數組,而且我認為它缺少像您建議的那樣功能齊全的選擇器語言。
至於用法,我已經編寫了一種類似於您建議的選擇器語言,但對於客戶端而言,數組尋址對其特定對象結構非常專有。
如果您要制作它,我肯定會使用這樣的系統,如果我看到可以提供幫助的領域,我什至可能會做出貢獻。
看起來有一個新選項: jQuery-JSONPath 。 似乎正是你所要求的。
不完全是您要查找的內容,但請查看object-scan 。 它有點冗長,但功能更強大,支持更多(復雜)用例。 這是一個如何使用它的示例
// const objectScan = require('object-scan'); const 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' }]; console.log(objectScan(['**.holding.id'], { useArraySelector: false, abort: true, rtn: 'parent', filterFn: ({ value }) => value === 'Banana' })(Characters)); // => { id: 'Banana' } console.log(objectScan(['**.appendage[*]'], { rtn: 'value', filterFn: ({ value }) => value.type === 'hand' && value.side === 'left' })(Characters)); // => [ { type: 'hand', side: 'left', holding: [ { id: 'Banana' } ] } ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.7.1"></script>
免責聲明:我是對象掃描的作者
請務必查看自述文件。 它里面有很多例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.