簡體   English   中英

JSONPath 或其他類似 XPath 的 JSON/Javascript 實用程序; 或 Jquery JSON

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM