【问题标题】:Merge JSON objects by joining common fields通过加入公共字段来合并 JSON 对象
【发布时间】:2021-03-23 07:17:27
【问题描述】:

我有 2 个语言环境文件,想将不同的单词组合到同一个键中

file1 en.json

{
    "name": "Apple",
    "error": {
        "payment": {
            "value1": "v1"
        }
    }
}

file2 zh.json

{
    "name": "orange",
    "error": {
        "payment": {
            "value1": "v2",
            "value2": "v5"
        }
    }
}

预期结果

{
    "name": "Apple\norange",
    "error": {
        "payment": {
            "value1": "v1\nv2",
            "value2": "v5"
        }
    }
}

我尝试jq -s . en.json zh.json | jq '.[]'| jq -s,但无法按键组合。

{
  "name": "orange",
  "error": {
    "payment": {
      "value1": "v2",
      "value2": "v5"
    }
  }
}

【问题讨论】:

  • 您的实际输入是否包含具有整数/布尔值的字段?

标签: json merge jq


【解决方案1】:

据我了解,您要解决的问题是您正在使用一组适合某些结构的 json,并且您希望收集在同一 json 路径上设置的所有值并使用聚合值。

对于假设此结构中没有数组的一般方法,您可以分解对象集上的所有标量值(流将对此有所帮助),按路径对它们进行分组,然后重建对象结构.

$ jq -n '
[inputs | tostream | select(length==2)] #1
  | group_by(.[0]) #2
  | map({
      path: .[0][0],
      values: [.[][1]]
    }) #3
  | reduce .[] as {$path, $values} (
      {};
      setpath($path; $values | join("\n"))
    ) #4
' en.json zh.json

注意-n 标志。

  1. 将对象从流中转换为路径/值对数组
  2. 按路径分组对
  3. 将分组对映射到更易读的内容(不是必需的)
  4. 根据分组创建一个新对象。还获取值数组并将它们组合为单个\n 分隔字符串。 (根据您的预期结果)

https://jqplay.org/s/Aa2KoeS2M6

【讨论】:

    【解决方案2】:

    你脑海中的转换逻辑让我无法理解,但考虑到 在您的示例中输入,以下确实会产生所需的结果 并且可以通过各种方式轻松扩展:

    jq -n '
      input as $one
      | input as $two
      | reduce ($two | paths(scalars)) as $p  ($one;
          getpath($p) as $v
          | ($two | getpath($p)) as $x
          | if $v
            then setpath($p; "\($v)\n\($x)")
            else setpath($p; $x)
            end)
    ' en.json zh.json                   
    

    【讨论】:

      【解决方案3】:

      或者类似地,使用jtc - unix JSON 处理器可以实现相同的查询:

      bash $ <en.json jtc -mi zh.json / -w'<>i:' -u'<>i:' -T'"{$a}\n{$b}"'
      {
         "error": {
            "payment": {
               "value1": "v1\nv2",
               "value2": "v5"
            }
         },
         "name": "Apple\norange"
      }
      

      - 第一个链 (-mi zh.json) 递归合并两个 JSON;
      - 第二条链 (-w'&lt;&gt;i:' -u'&lt;&gt;i:' -T'"{$a}\n{$b}"') 连接合并产生的标量

      PS。碰巧,我也是jtc 的创建者。
      聚苯乙烯。 SO要求上述免责声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-13
        • 1970-01-01
        • 2012-04-03
        • 2014-10-10
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多