如何解决使用 JMESPath 获得第一级
我有这个 JSON 文档:
{
"1": {
"a": "G1"
},"2": {
"a": "GM1"
}
}
我的预期结果应该是:
1,G1
2,GM1
有了*.a
,我得到了
[
"G1","GM1"
]
但我完全被其他人困住了。
解决方法
遗憾的是,您无能为力,完全符合您的用例并且可以适当扩展。
这是因为 JMESPath 没有办法引用其父级,尽管 this has been requested before 允许您使用类似
*.[join(',',[keys($),a])]
借助函数 keys
,您绝对可以提取键和值列表:
@.{keys: keys(@),values: *.a}
这给了
{
"keys": [
"1","2"
],"values": [
"G1","GM1"
]
}
但是你只是属于与 this other question 相同的情况,因为 keys
会给你一个键列表。
您也可以以列表列表结尾:
@.[keys(@),*.a]
会给你:
[
[
"1",[
"G1","GM1"
]
]
如果需要,您甚至可以更进一步flatten:
@.[keys(@),*.a] []
给出:
[
"1","2","G1","GM1"
]
有了所有这些,如果您碰巧有一个正好有两个项目的列表,那么解决方案是使用 join
和 slice 的组合: >
@.[join(',[keys(@),*.a][] | [::2]),join(',*.a][] | [1::2])]
这将给出预期:
[
"1,G1","2,GM1"
]
但是,遗憾的是,一旦您有两个以上的项目需要考虑,您最终会遇到一辆马车:
[
"1,3,G1,GM3",4,GM1,GM4"
]
有一个数据集
{
"1": {
"a": "G1"
},"2": {
"a": "GM1"
},"3": {
"a": "GM3"
},"4": {
"a": "GM4"
}
}
然后,当然,同样可以实现硬编码索引:
@.[join(',[keys(@)[0],*.a | [0]]),[keys(@)[1],*.a | [1]])]
这也给出了预期:
[
"1,GM1"
]
但是,遗憾的是,这只有在您事先知道将要返回给您的行数时才有效。
如果你想要一个单一的字符串,假设你想要提供数据接受 \n
作为一个新行,你可以再次 join
他整个数组:
@.[join(',*.a | [1]])].join(`\n`,@)
会给:
"1,G1\n2,GM1"
,
最后这个表达式对我来说是 100% 的:
[{key1:keys(@)[0],a:*.a| [0]},{key1:keys(@)[1],a:*.a| [1]}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。