【问题标题】:jq: How can a nested object be sliced to include the parent-key hierarchy?jq:如何对嵌套对象进行切片以包含父键层次结构?
【发布时间】:2018-05-20 15:35:28
【问题描述】:

使用 Bash 和 jq,如果我有一个 .<key1>.<key2>...<keyN> 形式的 Bash 变量过滤器 F 并且我想切片一个 Bash 变量 JSON 对象 O 以便结果只是对象的那一部分,包括 F 中的所有键,如何使用 jq 来完成?

例如,假设:

O='
{
   "a":
   {
      "b":
      {
         "c": { "p":1 },
         "x": 1
      },
      "x": 2
  },
  "x": 3
}'

然后,做:

F='.a.b.c'; jq -r "$F" <<<"$O"

结果:

{
   "p": 1
}

但是,我希望切片包含父键层次结构。

不优雅的解决方案

我想出了一个解决方案,但它涉及对 jq 的 2 次调用:

F='.a.b.c'; S="$(jq -r "$F" <<<"$O"); jq --null-input -r "$F |= $S"

结果:

{
  "a": {
    "b": {
      "c": {
        "p": 1
      }
    }
  }
}

该解决方案必须适用于 任何 有效的 OF Bash 变量,其中 O 存储一个 JSON 对象,而 F 是一个简单的键名过滤器,仅如上所述。例如:

F='.a.b'; S="$(jq -r "$F" <<<"$O")"; jq --null-input -r "$F |= $S"

结果:

{
  "a": {
    "b": {
      "c": {
        "p": 1
      },
      "x": 1
    }
  }
}

在 jq 中可以更简单地使用 key-hierarchy 过滤器对对象进行切片吗?

【问题讨论】:

    标签: json bash nested jq


    【解决方案1】:

    如果 $F 是一个有效的 jq 路径表达式(即,jq -n "$F" 有效):

    jq "$F as \$v | null | $F |= \$v" <<< "$O"
    

    (我在您的解决方案中包含了 |= 以显示相似性,但在这里您可以删除 |。)

    【讨论】:

    • 以上和jq "$F as \$v | {} | $F |= \$v" &lt;&lt;&lt;"$O"一样吗?否则,您能否告诉我您在制定解决方案时的解决方案想法是什么?我已经对其进行了测试,它当然可以工作。谢谢。
    • 我想展示您离一站式解决方案有多近。从 getpath 和 setpath 的角度思考通常会有所帮助。
    • 确实,感谢您的评论。支持并将标记解决方案。再次感谢,一如既往。
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多