获得 JMESPath 的第一级
Getting first level with 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",
"2"
],
[
"G1",
"GM1"
]
]
如果需要,您甚至可以更进一步flatten:
@.[keys(@), *.a] []
给出:
[
"1",
"2",
"G1",
"GM1"
]
有了这一切,如果您恰好有一个 恰好两个项目 的列表,那么解决方案是使用 join
and slice:[=35 的组合=]
@.[join(',',[keys(@),*.a][] | [::2]), join(',',[keys(@),*.a][] | [1::2])]
这将给出预期的结果:
[
"1,G1",
"2,GM1"
]
但是,遗憾的是,一旦您有两个以上的项目要考虑,您就会遇到一个问题:
[
"1,3,G1,GM3",
"2,4,GM1,GM4"
]
数据集为
{
"1": {
"a": "G1"
},
"2": {
"a": "GM1"
},
"3": {
"a": "GM3"
},
"4": {
"a": "GM4"
}
}
然后,当然也可以实现硬编码索引:
@.[join(',', [keys(@)[0], *.a | [0]]), join(',', [keys(@)[1], *.a | [1]])]
这也给出了预期的结果:
[
"1,G1",
"2,GM1"
]
但是,遗憾的是,这只有在您事先知道要返回给您的行数的情况下才有效。
如果你想要一个字符串,假设你想要输入数据接受 \n
作为一个新行,你可以 join
他再次整个数组:
@.[join(',', [keys(@)[0], *.a | [0]]), join(',', [keys(@)[1], *.a | [1]])].join(`\n`,@)
将给予:
"1,G1\n2,GM1"
最后这个表达式对我 100% 有效:
[{key1:keys(@)[0],a:*.a| [0]},{key1:keys(@)[1],a:*.a| [1]}]
我有这个 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",
"2"
],
[
"G1",
"GM1"
]
]
如果需要,您甚至可以更进一步flatten:
@.[keys(@), *.a] []
给出:
[
"1",
"2",
"G1",
"GM1"
]
有了这一切,如果您恰好有一个 恰好两个项目 的列表,那么解决方案是使用 join
and slice:[=35 的组合=]
@.[join(',',[keys(@),*.a][] | [::2]), join(',',[keys(@),*.a][] | [1::2])]
这将给出预期的结果:
[
"1,G1",
"2,GM1"
]
但是,遗憾的是,一旦您有两个以上的项目要考虑,您就会遇到一个问题:
[
"1,3,G1,GM3",
"2,4,GM1,GM4"
]
数据集为
{
"1": {
"a": "G1"
},
"2": {
"a": "GM1"
},
"3": {
"a": "GM3"
},
"4": {
"a": "GM4"
}
}
然后,当然也可以实现硬编码索引:
@.[join(',', [keys(@)[0], *.a | [0]]), join(',', [keys(@)[1], *.a | [1]])]
这也给出了预期的结果:
[
"1,G1",
"2,GM1"
]
但是,遗憾的是,这只有在您事先知道要返回给您的行数的情况下才有效。
如果你想要一个字符串,假设你想要输入数据接受 \n
作为一个新行,你可以 join
他再次整个数组:
@.[join(',', [keys(@)[0], *.a | [0]]), join(',', [keys(@)[1], *.a | [1]])].join(`\n`,@)
将给予:
"1,G1\n2,GM1"
最后这个表达式对我 100% 有效:
[{key1:keys(@)[0],a:*.a| [0]},{key1:keys(@)[1],a:*.a| [1]}]