鉴于以下示例JSON,我们不会总是知道订单......
{
"contacts": [
{
"id": 287997,
"type": "P",
"relationship": "Mother",
"firstName": "Sara",
"lastName": "Johnson"
},
{
"id": 300982,
"type": "EC",
"relationship": "Aunt",
"firstName": "Janet",
"lastName": "Smith"
},
{
"id": 287200,
"type": "P",
"relationship": "Father",
"firstName": "William",
"lastName": "Johnson"
},
{
"id": 287997,
"type": "EC",
"relationship": "Friend",
"firstName": "Harold",
"lastName": "Johnson"
}
]
}
我想要检索第一个类型为'EC'的联系人。以下检索所有'EC'类型的联系人就好......
$.contacts[?(@.type == 'EC')]
但是,我只想要第一次EC联系。我试过......
$.contacts[?(@.type == 'EC')][0]
但是这没用。我尝试了其他一些没有运气的变化。如果可能的话,我希望能够在不超出JSON-Path方法的情况下实现这一目标。
我知道我可以组合这样的表达式......
$.contacts[?(@.type == 'EC' && @.firstName == 'Janet')]
但是,我需要获得与'EC'表达式匹配的第一个联系人。因此,在评估'EC'表达式后,获取第一个已过滤的联系人。
我感谢任何帮助!谢谢!
答案 0 :(得分:0)
凯文 - 昨天我发布了一个我一直在研究的JS-lib(DefiantJS),它完全按照你想要的方式解决你的问题,并使用标准化的XPath代替JSONPath。在这个页面上,有一个我写过XPath评估器的工具。
http://www.defiantjs.com/#xpath_evaluator
单击“编辑”,我粘贴了您的JSON结构,然后再次单击“编辑”(以便该工具解析结构)。现在,输入下面的XPath将过滤您想要的选择:
//contacts[./type="EC"][1]
将其放入Javascript代码:
var obj = {
"contacts": [
{
"id": 287997,
"type": "P",
"relationship": "Mother",
"firstName": "Sara",
"lastName": "Johnson"
},
{
"id": 300982,
"type": "EC",
"relationship": "Aunt",
"firstName": "Janet",
"lastName": "Smith"
},
{
"id": 287200,
"type": "P",
"relationship": "Father",
"firstName": "William",
"lastName": "Johnson"
},
{
"id": 287997,
"type": "EC",
"relationship": "Friend",
"firstName": "Harold",
"lastName": "Johnson"
}
]
};
var sel = JSON.search(obj, '//contacts[./type="EC"][1]');
// sel[0] will contain your filtered object
DefiantJS使用新方法扩展全局对象; “搜索”。由于函数“search”总是返回匹配元素的数组,因此选择的句柄为“sel [0]”。使用lastName“Johnson”选择联系人的另一个Xpath是:
//contacts[./lastName="Johnson"]
XPath评估工具也有示例XPath - 这对于不熟悉XPath的开发人员来说非常容易。 DefiantJS的源代码可以在Github找到: