JSON路径将表达式与索引相结合

时间:2013-11-06 18:47:02

标签: json jsonpath

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

我感谢任何帮助!谢谢!

1 个答案:

答案 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找到:

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