我想使用jq
将JSON转换为分隔符分隔的扁平结构。
此前已经有人尝试过了,比如Flatten nested JSON using jq。
但是该页面中的解决方案无法处理包含数组的JSON。例如,如果JSON是:
{"a":{"b":[1]},"x":[{"y":2},{"z":3}]}
上面的解决方案将无法将上述内容转换为:
{"a.b.0":1,"x.0.y":2,"x.1.z":3}
此外,我正在寻找一个解决方案,它还将允许使用任意的分隔符。例如,假设空格字符是分隔符。在这种情况下,结果应该是:
{"a b 0":1,"x 0 y":2,"x 1 z":3}
我希望通过一个Bash(4.2+)函数来访问此功能,就像在CentOS 7中找到的那样,类似于:
flatten_json()
{
local JSONData="$1"
# jq command to flatten $JSONData, putting the result to stdout
jq ... <<<"$JSONData"
}
解决方案应适用于所有JSON数据类型,包括null和boolean。例如,考虑以下输入:
{"a":{"b":["p q r"]},"w":[{"x":null},{"y":false},{"z":3}]}
它应该产生:
{"a b 0":"p q r","w 0 x":null,"w 1 y":false,"w 2 z":3}
{"top":{"com.acme":37}}
将需要选择器.top."com.acme"
),则输出将具有如示例选择器中所示的路径组件引用?再次感谢您提供的出色解决方案!我最初想要提供分隔符的原因是为了解决这个问题。我可以获取结果并使用sed
使其具有所需的引用。它确实有效,但很笨拙。我希望有一种优雅的jq
方法! - Steve Amerige{} {}
- Jeff Mercado