微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 JMESPath 获得第一级

如何解决使用 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"
]

有了所有这些,如果您碰巧有一个正好有两个项目的列表,那么解决方案是使用 joinslice 的组合: >

@.[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 举报,一经查实,本站将立刻删除。