2

鉴于以下示例 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”表达式后,获取第一个过滤的联系人。

我很感激我能得到的任何帮助!谢谢!

4

1 回答 1

0

Kevin - 昨天我发布了一个我一直在研究的 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]”。另一个选择姓氏为“Johnson”的联系人的 Xpath 是:

//contacts[./lastName="Johnson"]

XPath 评估器工具也有示例 XPath - 这是为了方便不熟悉 XPath 的开发人员。DefiantJS 的源代码可以在 Github 找到:

https://github.com/hbi99/defiant.js

于 2014-01-03T12:58:57.963 回答