15

我一直在研究 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,我不能使用真实的示例......)

......而且,为了让它更有趣,如果我要创造这样的东西,会有人使用它吗?

4

8 回答 8

6

查看JSON Select - JSON 的类似 CSS 的选择器。

于 2011-12-13T15:13:17.620 回答
4

好的,我为此创建了一个原型,可在此处找到: http ://code.google.com/p/jfunk/

它已经被证明对我很有用,所以我可能会慢慢改进并将它重构为更好的东西。但如果我得到好的反馈,我可以更快地行动。我也欢迎帮助。

于 2009-05-17T15:09:47.270 回答
4

绝对是一个有用的实用程序。

我的观点是,解决此问题的最佳方法是尽可能与 CSS 选择器保持相似,正如您所指出的。我建议深入了解jquery的选择器实现。

我会建议像

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

而不是您的使用示例。

我不确定即将到来的本机 json 支持将如何影响这一点......

于 2009-05-14T12:26:28.420 回答
3

尝试使用 JSPath - https://github.com/dfilatov/jspath

JSPath 是一种特定于域的语言 (DSL),它使您能够在 JSON 文档中导航和查找数据。使用 JSPath,您可以选择 JSON 项目以检索它们包含的数据。

JSON 的 JSPath 类似于 XML 的 XPath。

于 2012-11-27T19:13:34.027 回答
2

Dojo's dojo.getObject has a facility that works loosely like this, where you can provide a path like "a.b.c" to the property you want to fetch.

Check it out:

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

I don't think it understands arrays quite that well and I think it is missing a full-featured selector language like the one you are suggesting.

As for usage, I've coded a selector language like the one you are suggesting, but for a client, and array addressing is very proprietary to their particular object structure.

I would definitely use a system like this if you were to make it, and perhaps even contribute if I saw an area I could help with.

于 2009-05-14T15:48:31.523 回答
2

我刚刚编写了一个客户端 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

我希望你会发现它有用。

于 2014-01-02T11:23:37.387 回答
1

看起来有一个新选项: jQuery-JSONPath。似乎正是你所要求的。

于 2014-08-19T14:53:03.877 回答
0

不完全是您要查找的内容,但请查看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>

免责声明:我是对象扫描的作者

请务必查看自述文件。里面有很多例子。

于 2020-11-17T06:34:06.447 回答