如何将 json 结构更改为对象并使用 jq 重命名键

How can I change a json structure into an object and rename keys with jq

我正在尝试使用 jq 将下面的原始 json 转换为所需的 json 结果。 目标: name 重命名为 pathParameterName type 重命名为 datasetParameter

原始 Json 我正在尝试转换

{
"pathOptions": {
        "parameters": {
            "raw_date": {
                "name": "raw_date",
                "type": "Datetime",
                "datetimeOptions": {
                    "localeCode": "en-GB"
                },
                "createColumn": true,
                "filter": {
                    "expression": "(after :date1)",
                    "valuesMap": {
                        ":date1": "2022-03-08T00:00:00.000Z"
                    }
                }
            }
        }
    }
  }

Json 期望的结果:

{
  "pathOptions": {
    "parameters": [
      {
        "pathParameterName": "raw_date",
        "datasetParameter": {
          "name": "raw_date",
          "type": "Datetime",
          "datetimeOptions": {
            "localeCode": "en-GB"
          },
          "createColumn": true,
          "filter": {
            "expression": "(after :date1)",
            "valuesMap": [
              {
                "valueReference": ":date1",
                "value": "2022-03-08T00:00:00.000Z"
              }
            ]
          }
        }
      }
    ]
  }
 }


这是我目前拥有的:

map_values(if type == "object" then to_entries else . end)

这是我上面的代码当前生成的结果。 -我正在努力重命名密钥。

{
  "pathOptions": [
    {
      "key": "parameters",
      "value": [
        {
          "pathParameterName": "raw_date",
          "datasetParameter": {
            "name": "raw_date",
            "type": "Datetime",
            "datetimeOptions": {
              "localeCode": "en-GB"
            },
            "createColumn": true,
            "filter": {
              "expression": "(after :date1)",
              "valuesMap": [
                {
                  "valueReference": ":date1",
                  "value": "2022-03-08T00:00:00.000Z"
                }
              ]
            }
          }
        }
      ]
    }
  ]
}

函数 to_entries,“在对象和 key-value 对数组之间进行转换”(参见 manual)。要重命名预设 keyvalue 字段,只需使用新对象将它们重新分配给新名称,如 {valueReference: .key, value}.

jq '
  .pathOptions.parameters |= (
    to_entries | map({
      pathParameterName: .key,
      datasetParameter: (
        .value | .filter.valuesMap |= (
          to_entries | map({valueReference: .key, value})
        )
      )
    })
  )
'
{
  "pathOptions": {
    "parameters": [
      {
        "pathParameterName": "raw_date",
        "datasetParameter": {
          "name": "raw_date",
          "type": "Datetime",
          "datetimeOptions": {
            "localeCode": "en-GB"
          },
          "createColumn": true,
          "filter": {
            "expression": "(after :date1)",
            "valuesMap": [
              {
                "valueReference": ":date1",
                "value": "2022-03-08T00:00:00.000Z"
              }
            ]
          }
        }
      }
    ]
  }
}

Demo