我想合并两个具有公用键的JSON对象

对象A

{
  "extensions": { 
    "app_name": "extensions-prod"
  },
  "plugins": { 
    "app_name": "plugins-prod" 
  }
}

对象B

{
  "plugins": { 
    "project_name": "plugins-prod" 
  }
}

请注意,情况并非如此.

{
  "plugins": { 
    "project_name": "plugins-prod",
    "app_name": "plugins-prod" 
  }
}

我确实研究了其他的SOposts,但不是很有用,因为我的 struct 不同.另外,json对象是bash变量,不包含在文件中.

[编辑] 我不知道公用键是什么,因为JSON对象是在CI环境中动态生成的.

推荐答案

[编辑]我不知道公钥是什么

对于in,您可以找出给定的关键点是否存在于给定的对象中.因此,您可以使用with_entries来迭代一个对象的字段,而使用select(Keep)只迭代那些.key出现在另一个对象中的条目.如果对象A以这种方式被"修剪",则可以使用*将其(深度地)合并到对象B中:

jq -n --argjson objA "$objA" --argjson objB "$objB" \
  '$objB * ($objA | with_entries(select(.key | in($objB))))'

这假设(根据您的示例数据)对象B只包含公共关键点,因此只有对象A必须修剪到对象B的关键点.如果通常不是这样,请使用对象A对称处理对象B.实际上,您只需在可参数化函数中定义修剪,并在两个对象上相互使用它:

jq -n --argjson objA "$objA" --argjson objB "$objB" '
  def trim_to($o): with_entries(select(.key | in($o)));
  ($objB | trim_to($objA)) * ($objA | trim_to($objB))
'

在给定样本数据的情况下,两种输出均为:

{
  "plugins": {
    "project_name": "plugins-prod",
    "app_name": "plugins-prod"
  }
}

Json相关问答推荐

try 将文本标记放置在条形图上的同一高度

Jolt转换,如果任何字段为空,则将对象值设置为空

带有PowerShell内核的NewtonSoft json.Net的奇怪行为

Jolt需要将缺少的值设置为空并保持相同的位置

集成wix.comstore API|变音符号问题

JQ:获取该值的较短语法是什么

在linux控制台中解析json字符串的最简单方法是什么?

报告重复的对象键

Android 如何判断小时时间是否在两个时间之间?

在 CodePipeline 中调用 lambda 时传递用户参数

嵌套存储在字符串变量中的 JSON 对象

使用杰克逊解析Kotlin 中的通用密封类

通过sql查询读取嵌套Json

Rails 控制器无需编码即可渲染 json

JQuery,使用 GET 方法发送 JSON 对象

如何在golang中获取 struct 的json字段名称?

使用 c# 通用地展平 Json

验证和格式化 JSON 文件

如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性

使用 C# 调用 json