【问题标题】:How to merge two JSON files using jq or any tool?如何使用 jq 或任何工具合并两个 JSON 文件?
【发布时间】:2021-05-07 11:52:13
【问题描述】:

我有 2 个 json 文件,想将它们合并到一个文件中。 这里是文件内容:

a.json:

{
    "config":
    {
        "config1":
        {
            "config11":
            {
                "apple":"apple",
                "orange":"orange",
                "lemon":[
                    "lemon1",
                    "lemon2",
                    "lemon3"
                ],
                "pear":"pear"
            }
        },
        "config2":
        {
            "config21":"hello",
            "config22":"goodbye"
        }
    }
}

b.json:

{
    "config":
    {
        "config1":
        {
            "config11":
            {
                "apple":null,
                "orange":null,
                "lemon":[
                    "lemon4",
                    "lemon5",
                    "lemon6"
                ],
                "pear":null
            }
        },
        "config2":
        {
            "config21":"hey",
            "config22":null
        }
    }
}

我想将b.json的非空部分合并到a.json中

预期结果:

{
    "config":
    {
        "config1":
        {
            "config11":
            {
                "apple":"apple",
                "orange":"orange",
                "lemon":[
                    "lemon4",
                    "lemon5",
                    "lemon6"
                ],
                "pear":"pear"
            }
        },
        "config2":
        {
            "config21":"hey",
            "config22":"goodbye"
        }
    }
}

我试试这个命令:

jq -s '.[0] + .[1]' a.json b.json

但输出不是我想要的

我读了https://stedolan.github.io/jq/manual,但我仍然不知道该怎么做

有什么帮助吗?谢谢。

追加

aa.json

{
  "config": {
    "config_again": {
      "country": {
        "countrylist": [
          "CANADA",
          "MEXICO",
          "USA"
        ]
      },
      "language": {
        "languageorderlist": [
          "en_US",
          "hu_HU",
          "in_ID",
          "it_IT",
          "iw_IL",
          "zh_CN"
        ]
      },
      "video": {
        "mp4": "1",
        "mkv": "1"
      },
      "Audio": {
        "audio_audio": "0x111111"
      }
    }
  }
}

bb.json:

{
  "config": {
    "config_again": {
      "country": {
        "countrylist": [
          "USA"
        ]
      },
      "language": {
        "languageorderlist": [
          "en_US",
          "de_DE"
        ]
      },
      "video": {
        "mp4": null,
        "mkv": null
      },
      "Audio": {
        "audio_audio": "0x666666"
      }
    }
  }
}

【问题讨论】:

    标签: json linux bash shell jq


    【解决方案1】:

    这里简单解决方案的关键是使用pathsgetpathsetpath,例如像这样:

    调用

    jq -f program.jq --argfile b b.json a.json
    

    program.jq

    reduce ($b | paths(scalars)) as $p (.;
      ($b|getpath($p)) as $v
      | if $v != null then setpath($p; $v) else . end)
    

    【讨论】:

    • 你看它的时间比我多——这真的是一个独特的、非重复的问题吗? (乍一看,我没有看到区别因素)。
    • 好问题,但我并不乐观地认为我能在不浪费大量时间的情况下找到它......
    • 嗯。仔细观察,我认为它可能与 两个 重复,remove all null valuesHow to merge 2 json objects from 2 files using jq 接近,但是虽然结合这两个答案会起作用,但最终结果不会那么干净就像你在这里所做的一样,所以保持开放是有价值的。
    • 谢谢。但在这种情况下(我添加了另外两个 json 文件 aa.json 和 bb.json),jq -f program.jq --argfile b bb.json aa.json,它不起作用。我想不出原因。我找到了另一种方式:Merging JSON files recursively in the command-line
    【解决方案2】:

    Merging JSON files recursively in the command-line

    deepmerge.jq:

    def deepmerge(a;b):                                                                                                                                                  
        reduce b[] as $item (a; 
            reduce ($item | keys_unsorted[]) as $key (.; 
                $item[$key] as $val | ($val | type) as $type | .[$key] = if ($type == "object") then
                deepmerge({}; [if .[$key] == null then {} else .[$key] end, $val])
                elif ($type == "null") then
                .[$key]
                else
                $val
                end)
            );   
        deepmerge({}; .)
    
    jq -f deepmerge.jq -s aa.json bb.json
    

    有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2022-01-09
      相关资源
      最近更新 更多