jmespath - 从 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 中删除方括号?
解决方案
发生这种情况是因为*
indata.*
可能返回多个值,例如来自:
{
"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-with-nested-data
所以你的表达最终是:
*[].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"
}
]
推荐阅读
- ios - 在 iOS 13 测试版中,应用程序在应用程序启动时崩溃
- git - 从 Github 中删除一个特定的提交
- reactjs - 在反应路由器中单击链接时回调不起作用
- ruby-on-rails - 这是一个时间关系不好的设计吗?
- android - 我如何为锦标赛应用程序获取 pubg mobile 等游戏的数据?
- amazon-web-services - 可以在 Rails 中设置多个 AWS 配置吗?
- javascript - 试图理解对象的行为
- javascript - Angular:错误语法错误:“JSON.parse:JSON 数据的第 1 行第 1 列的意外字符”
- authentication - 如何从请求登录表单中获取数据 Laravel
- javascript - 从给定 URL 获取数据时正确映射到接口