如何使用 jsonpath 语法从 json 中提取数据

how do you pull data from json using jsonpath syntax

我有一个这样的 json 文件,我需要选择: 时间戳、值并按维度分组。

json 文件如下所示:

{
"totalCount": 10,
"nextPageKey": null,
"result": [
{
"metricId": "builtin:host.cpu.usage,
"data": [
{
"dimensions": [
"HOST-1234"
],
"dimensionMap": {
"dt.entity.host": "HOST-1234"
},
"timestamps": [
1642606200000,
1642606800000,
1642607400000,
1642608000000,
1642608600000,
1642609200000,
1642609800000
],
"values": [
40.86490249633789,
38.45122528076172,
38.24514389038086,
52.10111999511719,
51.01322937011719,
40.43871307373047,
40.392024993896484
]
},

我需要能够使用 json 路径从此 json 中按维度分组提取时间戳和值。

我试过这个:

$.data['timestamps']
$.data['values']

不返回任何数据,任何想法

更新(下面是原始答案)

首先,让我们更正您的数据,使其真正有效 JSON

{
  "totalCount": 10,
  "nextPageKey": null,
  "result": [
    {
      "metricId": "builtin:host.cpu.usage",
      "data": [
        {
          "dimensions": [
            "HOST-1234"
          ],
          "dimensionMap": {
            "dt.entity.host": "HOST-1234"
          },
          "timestamps": [
            1642606200000,
            1642606800000,
            1642607400000,
            1642608000000,
            1642608600000,
            1642609200000,
            1642609800000
          ],
          "values": [
            40.86490249633789,
            38.45122528076172,
            38.24514389038086,
            52.10111999511719,
            51.01322937011719,
            40.43871307373047,
            40.392024993896484
          ]
        }
      ]
    }
  ]
}

现在我可以正确地看到结构,我的建议是

$.result[*].data[*]['timestamps','values'][*]

分解:

$.result                                         get `result` property
        [*]                                      get all array elements
           .data                                 get `data` property
                [*]                              get all array elements
                   ['timestamps','values']       get `timestamps` and `values`
                                          [*]    get all array elements

这将给出结果集:

[
  1642606200000,
  1642606800000,
  1642607400000,
  1642608000000,
  1642608600000,
  1642609200000,
  1642609800000,
  40.86490249633789,
  38.45122528076172,
  38.24514389038086,
  52.10111999511719,
  51.01322937011719,
  40.43871307373047,
  40.392024993896484
]

末尾的 [*] 是 return 所有值本身。

由于您希望将它们分组,因此您可以 删除 [*] 并得到这个

[
  [
    1642606200000,
    1642606800000,
    1642607400000,
    1642608000000,
    1642608600000,
    1642609200000,
    1642609800000
  ],
  [
    40.86490249633789,
    38.45122528076172,
    38.24514389038086,
    52.10111999511719,
    51.01322937011719,
    40.43871307373047,
    40.392024993896484
  ]
]

其中每个子数组分别是 timestampsvalues 处的值。

但是,只有在 resultdata 处只有一个数组元素时才有效。如果添加更多元素,它们的内容将获得单独的子数组。

你可以在我的游乐场尝试所有这些,https://json-everything.net/json-path


(原始回复,为后人保留)

$.data['timestamps'] 或简单地 $.data.timestamps 只是去 return timestamps 下的数组。要获取数组中的值,您需要在末尾添加 [*]

$.data.timestamps[*]

许多实现还支持 [ ] 选择器中的多个键,因此您可以使用

同时获得 timestampsvalues
$.data['timestamps','values'][*]

但请注意,您将获得包含所有值的单个列表,可能没有关于这些值来源的任何上下文。要解决此问题,您的实现 可能 也支持 return 每个值的路径。