如何使用 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
]
]
其中每个子数组分别是 timestamps
和 values
处的值。
但是,只有在 result
和 data
处只有一个数组元素时才有效。如果添加更多元素,它们的内容将获得单独的子数组。
你可以在我的游乐场尝试所有这些,https://json-everything.net/json-path。
(原始回复,为后人保留)
$.data['timestamps']
或简单地 $.data.timestamps
只是去 return timestamps
下的数组。要获取数组中的值,您需要在末尾添加 [*]
。
$.data.timestamps[*]
许多实现还支持 [ ]
选择器中的多个键,因此您可以使用
同时获得 timestamps
和 values
值
$.data['timestamps','values'][*]
但请注意,您将获得包含所有值的单个列表,可能没有关于这些值来源的任何上下文。要解决此问题,您的实现 可能 也支持 return 每个值的路径。
我有一个这样的 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
]
]
其中每个子数组分别是 timestamps
和 values
处的值。
但是,只有在 result
和 data
处只有一个数组元素时才有效。如果添加更多元素,它们的内容将获得单独的子数组。
你可以在我的游乐场尝试所有这些,https://json-everything.net/json-path。
(原始回复,为后人保留)
$.data['timestamps']
或简单地 $.data.timestamps
只是去 return timestamps
下的数组。要获取数组中的值,您需要在末尾添加 [*]
。
$.data.timestamps[*]
许多实现还支持 [ ]
选择器中的多个键,因此您可以使用
timestamps
和 values
值
$.data['timestamps','values'][*]
但请注意,您将获得包含所有值的单个列表,可能没有关于这些值来源的任何上下文。要解决此问题,您的实现 可能 也支持 return 每个值的路径。