【问题标题】:Jq - converting JSON to another JSON format using jqJq - 使用 jq 将 JSON 转换为另一种 JSON 格式
【发布时间】:2019-10-09 16:15:01
【问题描述】:

我正在使用 jqplay 来播放该格式。不知何故,我能够以某种不同的格式获得以下格式。但现在我想将这种格式更改为如下输出。它基本上我想组合两个 id 相同的对象。

'输入'

[
  {
    "id": "7972",
    "secondaryAddresses": {
      "1-2G8AXE": {
        "isDefaultBillingAddress": "true",
        "isDefaultShippingAddress": "true",
      }
    }
  }
]
[
  {
    "id": "7972",
    "secondaryAddresses": {
      "1-4BR2P6B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]
[
  {
    "id": "6980",
    "secondaryAddresses": {
      "1-9BR289B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]
[
  {
    "id": "6980",
    "secondaryAddresses": {
      "1-8B0989B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]

输出

[
  {
    "id": "7972",
    "secondaryAddresses": {
      "1-2G8AXE": {
        "isDefaultBillingAddress": "true",
        "isDefaultShippingAddress": "true",
      },
       "1-4BR2P6B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  },
  {
    "id": "6980",
    "secondaryAddresses": {
      "1-9BR289B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      },
       "1-8B0989B": {
        "isDefaultBillingAddress": "false",
        "isDefaultShippingAddress": "false",
      }
    }
  }
]

请帮我解决这个问题。我希望使用一些模板将一个 json 转换为另一种 json 格式。

【问题讨论】:

    标签: json jq


    【解决方案1】:

    修复样本输入后,以下调用

    < sample.json jq -n '
      [inputs[]]
      | group_by(.id)
      | map( reduce .[] as $x
               (.[0]|{id}; 
               .secondaryAddresses += ($x | .secondaryAddresses)))'
    

    产生:

    [
      {
        "id": "6980",
        "secondaryAddresses": {
          "1-9BR289B": {
            "isDefaultBillingAddress": "false",
            "isDefaultShippingAddress": "false"
          },
          "1-8B0989B": {
            "isDefaultBillingAddress": "false",
            "isDefaultShippingAddress": "false"
          }
        }
      },
      {
        "id": "7972",
        "secondaryAddresses": {
          "1-2G8AXE": {
            "isDefaultBillingAddress": "true",
            "isDefaultShippingAddress": "true"
          },
          "1-4BR2P6B": {
            "isDefaultBillingAddress": "false",
            "isDefaultShippingAddress": "false"
          }
        }
      }
    ]
    

    【讨论】:

    • 它工作了..' [inputs[]] | group_by(.id) | map( reduce .[] as $x (.[0]|{id}; .secondaryAddresses += ($x | .secondaryAddresses)))' 添加此模板后...但是可以向我解释什么是你在这里做......这将非常有帮助
    • 假设您对管道有一定的了解,很快就可以阅读 jq 手册中的 group_by、map 和 reduce。但知道您可以在管道中添加 debug 语句以查看发生了什么可能会有所帮助,就像 Unix/Linux 中的 tee 一样。
    【解决方案2】:

    这是一个有效的解决方案,它也很简单,尽管它是以辅助函数为代价的。由于此函数是通用函数,因此可能值得将其添加到您的此类函数库中。

    def aggregate_by(s; f; g):
      reduce s as $x  (null; .[$x|f] += [$x|g]);
    

    以下使用inputs,因此必须与jq的-n命令行选项配合使用:

    aggregate_by( inputs[]; .id; .secondaryAddresses)
    | map_values( add )
    | to_entries
    | map( {id: .key, secondaryAddresses: .value } )
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 2018-07-20
      • 2021-03-19
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多