使用jq和map将带有嵌套对象的JSON对象转换为Name=Value格式

使用jq和map将带有嵌套对象的JSON对象转换为Name=Value格式,json,nested,jq,key-value,Json,Nested,Jq,Key Value,完全被这件事缠住了 我有这样的JSON: { "create_option": "Restore", "disk_iops_read_write": 120, "disk_mbps_read_write": 25, "tags": { "Monitor": "No", "RSVaultBackup": &q

完全被这件事缠住了

我有这样的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_标记行部分也需要采用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"}
在act.jq中jq运行后

调用:

jq -rf act.jq file.json
使用类型来检查我们是否应该下去。如果.value的类型是object,那么我们再次拆分它,然后收集结果;否则,我们只是插值。您也可以内联编写f函数,即在act.jq中的to_条目|.[]之后。

调用:

jq -rf act.jq file.json

使用类型来检查我们是否应该下去。如果.value的类型是object,那么我们再次拆分它,然后收集结果;否则,我们只是插值。您也可以内联编写f函数,即在to_条目|.[]之后。这里有一个允许任意深度嵌套的解决方案,并演示了递归内部函数的使用:

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

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

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

您需要引用该值吗?在预期输出的前3行中,它们被引用,而最后一行没有被引用。@dibery是的-我编辑了这篇文章以反映我仍然需要引用值。您需要引用值吗?在预期输出的前3行中,它们被引用,而最后一行没有被引用。@dibery是的-我编辑了这篇文章以反映我仍然需要引用值这太棒了非常感谢你。我将花一些时间来剖析它,但马上将它粘贴在jqplay中,效果很好。太棒了非常感谢你。我将花一些时间来剖析这一点,但立即将其粘贴在jqplay中,效果很好。谢谢-另一个极好的信息-我从这两个答案中学到了很多,而不仅仅是费力地阅读文档和自己的实验-很棒的论坛!!谢谢-另一个极好的信息-我从这两个答案中学到了很多,远远超过了费力阅读文档和自己的实验-很棒的论坛!!