【问题标题】:Use jq to append value of one key to another key, but at a different level of document tree使用 jq 将一个键的值附加到另一个键,但在文档树的不同级别
【发布时间】:2022-11-11 00:50:12
【问题描述】:

我想将整个 JSON 文件输出到一个新文件,但将 filter-values 的值作为字符串附加到每个 filter 数组中每个 description 的每个 parameters 数组中。

一些注意事项:

  • 我只对foo 对象感兴趣
  • 并非所有foo 对象都包含parameter 数组
  • 并非所有parameter 数组都包含过滤器对象
{
  "empty": {},
  "paths": {
    "somepath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "sort"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param."
          },
          {
            "name": "orderby",
            "description": "This is the `orderby` param."
          }
        ],
        "filter-values": [
          "1",
          "2",
          "3"
        ],
        "orderby-values": [
          "a",
          "b",
          "c"
        ]
      },
      "bar": {}
    },
    "anotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param."
          }
        ],
        "filter-values": [
          "4",
          "5",
          "6"
        ]
      }
    },
    "yetanotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          }
        ]
      }
    }
  }
}

这是我最接近让它工作的:

(.paths[].foo."filter-values" // empty | join(", ")) as $filters 
| (.paths[].foo.parameters // empty 
| . [] 
| select(.name? == "filter")).description |= . + " Possible values are: " + $filters

预期输出:

{
  "empty": {},
  "paths": {
    "somepath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "sort"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param. Possible values are: 1, 2, 3"
          },
          {
            "name": "orderby",
            "description": "This is the `orderby` param."
          }
        ],
        "filter-values": [
          "1",
          "2",
          "3"
        ],
        "orderby-values": [
          "a",
          "b",
          "c"
        ]
      },
      "bar": {}
    },
    "anotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param. Possible values are: 4, 5, 6"
          }
        ],
        "filter-values": [
          "4",
          "5",
          "6"
        ]
      }
    },
    "yetanotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          }
        ]
      }
    }
  }
}


实际输出(整个文档产生了两次,在某些情况下,错误的filter-values 附加到description):

{
  "empty": {},
  "paths": {
    "somepath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "sort"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param. Possible values are: 1, 2, 3"
          },
          {
            "name": "orderby",
            "description": "This is the `orderby` param."
          }
        ],
        "filter-values": [
          "1",
          "2",
          "3"
        ],
        "orderby-values": [
          "a",
          "b",
          "c"
        ]
      },
      "bar": {}
    },
    "anotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param. Possible values are: 1, 2, 3" 
          }
        ],
        "filter-values": [
          "4",
          "5",
          "6"
        ]
      }
    },
    "yetanotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          }
        ]
      }
    }
  }
}
{
  "empty": {},
  "paths": {
    "somepath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "sort"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param. Possible values are: 4, 5, 6"
          },
          {
            "name": "orderby",
            "description": "This is the `orderby` param."
          }
        ],
        "filter-values": [
          "1",
          "2",
          "3"
        ],
        "orderby-values": [
          "a",
          "b",
          "c"
        ]
      },
      "bar": {}
    },
    "anotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          },
          {
            "name": "filter",
            "description": "This is the `filter` param. Possible values are: 4, 5, 6"
          }
        ],
        "filter-values": [
          "4",
          "5",
          "6"
        ]
      }
    },
    "yetanotherpath": {
      "foo": {
        "parameters": [
          {
            "name": "page"
          }
        ]
      }
    }
  }
}

【问题讨论】:

    标签: jq


    【解决方案1】:

    这会做你想要的吗?

    (.paths[].foo | select(has("parameters"))) |= (
      (.parameters[] | select(.name == "filter").description) +=
        " Possible values are: (."filter-values" | join(", "))"
    )
    
    {
      "empty": {},
      "paths": {
        "somepath": {
          "foo": {
            "parameters": [
              {
                "name": "page"
              },
              {
                "name": "sort"
              },
              {
                "name": "filter",
                "description": "This is the `filter` param. Possible values are: 1, 2, 3"
              },
              {
                "name": "orderby",
                "description": "This is the `orderby` param."
              }
            ],
            "filter-values": [
              "1",
              "2",
              "3"
            ],
            "orderby-values": [
              "a",
              "b",
              "c"
            ]
          },
          "bar": {}
        },
        "anotherpath": {
          "foo": {
            "parameters": [
              {
                "name": "page"
              },
              {
                "name": "filter",
                "description": "This is the `filter` param. Possible values are: 4, 5, 6"
              }
            ],
            "filter-values": [
              "4",
              "5",
              "6"
            ]
          }
        },
        "yetanotherpath": {
          "foo": {}
        }
      }
    }
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2023-01-09
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多