获得 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]}]