与 jq 2 个 json 对象的交集

问题描述 投票:0回答:1

我有第一个 json 结构。 所有值始终为空。

{
    "A": {
        "A1": {
            "A11": null,
            "A12": null
        }
    },
    "B": {
        "B1": {
            "B12": null
        },
        "B2": null
    },
    "C": {
        "C1": {
            "C11": null,
            "C12": null
        },
        "C2" : {
            "C21": {
                "C211": null
            }
        }
    }
}

在第二个 json 结构中,所有值始终都是字符串。

{
    "A": {
        "A1": {
            "A11": "valueA11",
        }
    },
    "B": {
        "B1": {
            "B12": "valueB12",
            "B13": "valueB13"
        },
        "B2": "valueB2"
    },
    "C": "valueC"
}

结果将是:

{
    "A": {
        "A1": {
            "A11": "valueA11",
            "A12": null
        }
    },
    "B": {
        "B1": {
            "B12": "valueB12"
        },
        "B2": "valueB2"
    },
    "C": {
        "C1": {
            "C11": null,
            "C12": null
        },
        "C2" : {
            "C21": {
                "C211": null
            }
        }
    }
}

如果第二个 json 中存在键,如何用第二个 json 中的值填充第一个 json 键,否则我们保留空值

我在 bash 上尝试过使用 jq 但没有成功。我已准备好使用任何可以完成这项工作的工具。

json bash jq
1个回答
0
投票

您可以使用

JOIN
tostream
reduce
收集的所有叶路径折叠到输出文档中:

jq -s '
  map([tostream | select(has(1))] | INDEX(first|@json))
  | reduce JOIN(last; first|to_entries[]; .key; [first.value[0], last[1]])
    as [$p,$v] (null; setpath($p;$v))
' first.json second.json
{
  "A": {
    "A1": {
      "A11": "valueA11",
      "A12": null
    }
  },
  "B": {
    "B1": {
      "B12": "valueB12"
    },
    "B2": "valueB2"
  },
  "C": {
    "C1": {
      "C11": null,
      "C12": null
    },
    "C2": {
      "C21": {
        "C211": null
      }
    }
  }
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.