如何使用 jq 更新嵌套且部分扁平化对象中的值?

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

我需要用

version
的值覆盖属性
image
。问题是,json 文档可以有多种形式,因此部分嵌套可以被展平:

示例文档 1

{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired.modules.event-bridge-redis": {
        "settings": {
          "image": "redis:6.2.7",
          "createOptions": ""
        },
        "type": "docker",
        "status": "running",
        "restartPolicy": "always",
        "version": "1.0"
      },
      "properties.desired.modules.event-bridge-metrics": {
        "settings": {
          "image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
          "createOptions": ""
        },
        "type": "docker",
        "version": "1.0",
        "status": "running",
        "restartPolicy": "always"
      }
    },
    "$edgeHub": {
    }
  }
}

示例文档2

{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired.modules": {
        "event-bridge-redis": {
          "settings": {
            "image": "redis:6.2.7",
            "createOptions": ""
          },
          "type": "docker",
          "status": "running",
          "restartPolicy": "always",
          "version": "1.0"
        },
        "event-bridge-metrics": {
          "settings": {
            "image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
            "createOptions": ""
          },
          "type": "docker",
          "version": "1.0",
          "status": "running",
          "restartPolicy": "always"
        }
      }
    },
    "$edgeHub": {
    }
  }
}

示例文档 1 的预期输出

{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired.modules.event-bridge-redis": {
        "settings": {
          "image": "redis:6.2.7",
          "createOptions": ""
        },
        "type": "docker",
        "status": "running",
        "restartPolicy": "always",
        "version": "redis:6.2.7"
      },
      "properties.desired.modules.event-bridge-metrics": {
        "settings": {
          "image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
          "createOptions": ""
        },
        "type": "docker",
        "version": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
        "status": "running",
        "restartPolicy": "always"
      }
    },
    "$edgeHub": {
    }
  }
}

示例文档2的预期输出

{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired.modules": {
        "event-bridge-redis": {
          "settings": {
            "image": "redis:6.2.7",
            "createOptions": ""
          },
          "type": "docker",
          "status": "running",
          "restartPolicy": "always",
          "version": "redis:6.2.7"
        },
        "event-bridge-metrics": {
          "settings": {
            "image": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
            "createOptions": ""
          },
          "type": "docker",
          "version": "mcr.microsoft.com/azureiotedge-metrics-collector:1.19",
          "status": "running",
          "restartPolicy": "always"
        }
      }
    },
    "$edgeHub": {
    }
  }
}

是否可以定义一个 jq 查询,它可以处理多种形式的嵌套(从平面形式到嵌套形式),因此输入的形式也保留在输出中?

json jq
1个回答
0
投票

您可以使用

walk
遍历文档,并使用给定的过滤器(例如将
|=
的值分配给
version
)更新
.settings.image
匹配节点(例如具有
.version
键的对象):

walk(select(type == "object" and has("version")) |= (.version = .settings.image))

演示

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