【问题标题】:jq: populate template jsonjq:填充模板 json
【发布时间】:2021-11-10 22:36:51
【问题描述】:

我想使用json-template.json 填充json-data.json json 数据对象。

例子:

json-data.json:

[
  {name: "John", familyName: "Smith"},
  {name: "Samuel", familyName: "Schnaider"}
]

还有我的json-template.json

{
  key1: "value1",
  key2: "value2",
  name: "XXX",
  familyName: "YYY"
}

我想要的结果是:

[
  {
    key1: "value1",
    key2: "value2",
    name: "John",
    familyName: "Smith"
  },
  {
    key1: "value1",
    key2: "value2",
    name: "Samuel",
    familyName: "Schnaider"    
  }
]

关于如何使用jq获得它的任何想法?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    为了简单起见,因为您指出意图是 json-data.json 包含 JSON,假设它包含有效的 JSON。

    如果模板是有效的 JSON,它可能也会更简单,但是 万一你被你展示的模板卡住了,让我们继续吧。

    由于显示的模板不是有效的 JSON,但作为 jq 对象规范是有效的, 让我们首先假设我们可以使它成为 jq 程序的一部分,例如 由

    def template:
    {
      key1: "value1",
      key2: "value2",
      name: "XXX",
      familyName: "YYY"
    }
    ;
    

    我们现在只需要编写一个过滤器来将输入对象转换为模板指定的形式:

    def fillin($template):
      . as $in
      | reduce ($template|keys_unsorted[]) as $k ($template; if $in|has($k) then .[$k] = $in[$k] else . end);
    

    根据您的意见,我们只需致电:

    map(fillin(template))
    

    将所有 jq 代码放在一个文件中,调用将如下所示:

    jq -f populate-template.jq json-data.json
    

    【讨论】:

    • 我错过了写这篇文章 --> 如果我需要将 name 移动到 patient.name 怎么办?
    • 不确定您的确切意思,但它要么非常简单,要么非常简单。如果您无法弄清楚,请更具体,如有必要,请打开一个新的 SO Q。
    【解决方案2】:

    如果模板可能作为 JSON 无效,并且您想将其保存在单独的文件中,那么,假设是 bash 或类似 bash 的 shell,您可以编写:

    < json-data.json jq --argfile t <(jq -n -f template.txt) '
    
      def fillin($template):
        . as $in
        | reduce ($template|keys_unsorted[]) as $k ($template; if $in|has($k) then .[$k] = $in[$k] else . end);
    
      map(fillin($t))
    ' 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 2022-01-17
      相关资源
      最近更新 更多