JSON路径:获取对象中的第一个子节点

时间:2018-01-31 12:01:45

标签: json jsonpath

得到的API响应如下:

{
  "data": {
    "unpredictable_name_1": {
      "inner_data": [
        {
          "wanted_data": "something1",
          "other_data": 1000
        },
        {
          "wanted_data": "something2",
          "other_data": 1001
        }
      ],
      "something_else_1": "some_data"
    },
    "unpredictable_name_2": {
      "inner_data": [
        {
          "wanted_data": "something1",
          "other_data": 1000
        },
        {
          "wanted_data": "something2",
          "other_data": 1001
        }
      ]
    }
  }
}

我需要一个只返回此命令的JSON路径查询:

[
  {
    "wanted_data": "something1",
    "other_data": 1000
  },
  {
    "wanted_data": "something2",
    "other_data": 1001
  }
]

如果使用这个$..inner_data,我得到了两个inner_data数组,我发现没有办法只得到第一个。 (在此测试:https://jsonpath.curiousconcept.com/)。 $..inner_data[0]不起作用,因为它从两个对象中给出了两倍相同的数组元素。

1 个答案:

答案 0 :(得分:1)

这......

$.data.unpredictable_name_1.inner_data

...将返回:

[
   {
      "wanted_data" : "something1",
      "other_data" : 1000
   },
   {
      "wanted_data" : "something2",
      "other_data" : 1001
   }
]

但我怀疑您故意选择属性名称unpredictable_name_1来表明您不知道该属性的名称,因此不能依赖于在您的json路径中包含该名称。

我认为您希望获取inner_data第一个属性的data属性的全部内容,但由于数据的顶级属性不是数组他们没有第一或第二或任何位置的概念。

换句话说:unpredictable_name_1只是你文档视图中的第一个,JsonPath没有将它作为data的第一个属性的概念,因此JsonPath无法在此基础上找到该属性位置。

相比之下,inner_data是一个数组,因此可以通过位置进行寻址。例如:$..inner_data[0]将返回每个inner_data属性的第一个元素。 JsonPath可以应用位置运算符[0],因为inner_data是一个数组。

因此,JsonPath无法执行此操作:获取inner_data 的第一个属性的data属性的全部内容,因为data中的顶级属性不是数组的成员。为了从给定的JSON获取数据,您需要使用JSON库将JSON反序列化为某种结构(例如Map)(在Java领域,这可能是Gson或Jackson,您没有提到您的语言在OP中,但是你喜欢使用任何语言的JSON de / serialization库,然后你将自己的 first 定义应用于该结构。