从JMESPath表达式中删除方括号



我有以下JSON:

{
"694992": [
{
"domain": "example.com",
"domain_id": 49392164,
"data": [
{
"category": "Main",
"category_id": 77133,
"data": [
{
"keyword": "sofort",
"key_id": 25963217,
"data": {
"9242": [
27,
"https://www.example.com/sofort",
false,
false,
1
]
}
},
{
"keyword": "das",
"key_id": 32325213,
"data": {
"9242": [
23,
"https://www.example.com/das",
false,
false,
1
]
}
},
{
"keyword": "wiki",
"key_id": 32325317,
"data": {
"9242": [
44,
"https://www.example.com/wiki",
false,
false,
1
]
}
}
]
}
]
}
]
}

使用JMESPath表达式,我想从JSON中提取一些数据,并以以下形式获取:

+---------+--------+--------------------------------+
| Keyword | Number | URL                            |
+---------+--------+--------------------------------+
| sofort  | 27     | https://www.example.com/sofort |
+---------+--------+--------------------------------+
| das     | 23     | https://www.example.com/das    |
+---------+--------+--------------------------------+
| wiki    | 44     | https://www.example.com/wiki   |
+---------+--------+--------------------------------+

我使用以下JMESPath表达式:

*[].data[].data[].{Keyword: keyword, Number: data.*[0], URL: data.*[1]}

但我的输出就像

+---------+--------+----------------------------------+
| Keyword | Number | URL                              |
+---------+--------+----------------------------------+
| sofort  | [27]   | [https://www.example.com/sofort] |
+---------+--------+----------------------------------+
| das     | [23]   | [https://www.example.com/das]    |
+---------+--------+----------------------------------+
| wiki    | [44]   | [https://www.example.com/wiki]   |
+---------+--------+----------------------------------+

如何删除数字和URL中的方括号?

这是因为data.*中的*可能返回多个值,例如:
{
"keyword": "wiki",
"key_id": 32325317,
"data": {
"9242": [
44,
"https://www.example.com/wiki",
false,
false,
1
],
"9243": [
44,
"https://www.example.com/wiki",
false,
false,
1
]
}
}

这是一个完全有效的JSON。

如果确定data始终只包含一个元素,则可以使用管道表达式:|来停止投影,并帮助从数组中提取第一个元素。

来自文件:

管道表达式对于停止投影非常有用。它们也可以用于对表达式进行分组。

来源:https://jmespath.org/examples.html#pipes
这个例子也说明了这一点:https://jmespath.org/examples.html#working-带有嵌套数据

所以你的表达最终是:

*[].data[].data[].{Keyword: keyword, Number: data.*[0] | [0], URL: data.*[1] | [0]}

这给出了预期:

[
{
"Keyword": "sofort",
"Number": 27,
"URL": "https://www.example.com/sofort"
},
{
"Keyword": "das",
"Number": 23,
"URL": "https://www.example.com/das"
},
{
"Keyword": "wiki",
"Number": 44,
"URL": "https://www.example.com/wiki"
}
]

最新更新