【问题标题】:Using jq and map to convert JSON objects with nested objects to Name=Value format使用 jq 和 map 将带有嵌套对象的 JSON 对象转换为 Name=Value 格式
【发布时间】:2020-08-07 14:30:48
【问题描述】:

完全坚持这个。

我有这样的 JSON:

{
  "create_option": "Restore",
  "disk_iops_read_write": 120,
  "disk_mbps_read_write": 25,
  "tags": {
    "Monitor": "No",
    "RSVaultBackup": "2dc504bd"
  }
}

和下面的jq

.|to_entries|map("nfs-0_\(.key)=\"\(.value)\"")|.[]

我已经解决了

nfs-0_create_option="Restore"
nfs-0_disk_iops_read_write="120"
nfs-0_disk_mbps_read_write="25"
nfs-0_tags="{"Monitor":"No","RSVaultBackup":"2dc504bd"}"

但 nfs-0_tags 行部分也需要采用 name=value 格式。我想结束的是这个

nfs-0_create_option="Restore"
nfs-0_disk_iops_read_write="120"
nfs-0_disk_mbps_read_write="25"
nfs-0_tags={Monitor="No", VaultBackup="2dc504bd"}

我觉得我应该能够递归地应用地图,但对于我的一生,我无法弄清楚如何实现。

有什么想法吗?

谢谢:)

编辑:

好的,我想我现在离这个越来越近了

.|.tags |= (to_entries | map("\(.key) = \(.value)"))|to_entries|map ("\(.key) = \(.value)")|.[]

我现在明白了

create_option = Restore
disk_iops_read_write = 120
disk_mbps_read_write = 25
tags = ["Monitor = No","RSVaultBackup = 2dc504bd"]

但我需要花括号 {} 中的标签行,其中键不加引号,值加引号。像这样

nfs-0_tags={Monitor="No", VaultBackup="2dc504bd"}

编辑:

我仍然希望输出看起来像这样

nfs-0_create_option="Restore"
nfs-0_disk_iops_read_write="120"
nfs-0_disk_mbps_read_write="25"
nfs-0_tags={Monitor="No", VaultBackup="2dc504bd"}

jq 运行后

【问题讨论】:

  • 需要引用值吗?在您预期输出的前 3 行中,它们被引用,而最后一行则没有。
  • @dibery 是的 - 我已经编辑了帖子以反映我仍然需要引用该值

标签: json nested jq key-value


【解决方案1】:

这是一个允许任意深度嵌套的解决方案,并说明了递归内部函数的使用:

def pairs:
  def q:
    if type == "string" then tojson
    elif type == "number" then "\"\(.)\""
    else . end;
  def ip:
    if type == "object"
    then "{" + (to_entries | map("\(.key)=\(.value|ip)") | join(",")) + "}"
    else q end;
  if type == "object"
  then to_entries[] | ("\(.key)=\(.value | ip)")
  else . end;

pairs

【讨论】:

  • 谢谢 - 另一个极好的信息 - 我从这两个答案中学到了很多东西,而不仅仅是涉水阅读文档和我自己的实验 - 很棒的论坛!
【解决方案2】:

act.jq:

def f:
 if .value|type=="object" then
  "nfs-0_\(.key)={\([.value|to_entries|.[]|"\(.key)=\"\(.value)\""]|join(","))}"
 else
  "nfs-0_\(.key)=\"\(.value)\""
 end;

to_entries|.[]|f

调用:

jq -rf act.jq file.json

使用type 检查我们是否应该下去。如果.value的类型是object,那么我们再次拆分,然后收集结果;否则我们只是插值它。你也可以写f函数内联(即在to_entries|.[]之后)。

【讨论】:

  • 太棒了! - 非常感谢。我将花一些时间来剖析它,但马上将它贴在 jqplay 中它会很有效。
猜你喜欢
  • 2014-10-12
  • 2019-12-27
  • 2019-12-26
  • 1970-01-01
  • 2017-12-03
  • 2016-09-14
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多