jq-将复杂的JSON解析为字符串
我试图使用jq-将复杂的JSON解析为字符串,json,parsing,jq,Json,Parsing,Jq,我试图使用jq解析JSON,它看起来像: { "username": "billy", "hero": { "something": "goeshere" }, "bumper": { "bumper2": { "bumper3": "splodge" } }, "morgan": [{ "abc": 123 }, 2, 4, { "de
jq
解析JSON,它看起来像:
{
"username": "billy",
"hero": {
"something": "goeshere"
},
"bumper": {
"bumper2": {
"bumper3": "splodge"
}
},
"morgan": [{
"abc": 123
}, 2, 4, {
"def": 567
}],
"password": "issilly"
}
进入
到目前为止,我必须
jq '. | to_entries[] | "request.\(.key) == '\(.value)'"'
这让我了解了其中的一部分,但我不知道如何“深入”到深层嵌套元素中,也不知道如何将生成的字符串连接到以“&&”分隔的单行中。这将为您提供与您发布的内容不完全相同的输出,但应该足够好,假设JavaScript不区分
foo.bar
和foo[“bar”]
说明:。
为我们提供所有值;但是我们只需要叶值,所以我们过滤掉那些数组或对象。然后我们使用[path()]
获得路径数组:这将是一个路径步骤数组,如:[[“用户名”]、[“英雄”、“某物”]、[“保险杠”、“保险杠2”、“保险杠3”]、[“摩根”、“0”、“abc”]…]等。现在对于每个路径,我们需要将每个路径步骤括在括号中,以获得JavaScript可以理解的内容tojson
将给出括号所需的确切内容,因此对象的字符串键将被引用,而数组的整数键则不会。现在,我们可以组合等式表达式:左侧需要一个请求
前置到我们构建的括号路径,而我们可以使用getpath
获取应该位于右侧的值(再次使用tojson
获取正确的文本)。路径(标量)
在
中输出表示字符串和数字路径的数组,使用getpath
可以获得这些路径上的值。因此,您只需要一个将路径表示转换为路径表达式的函数,如:
def pr2pe:
reduce .[] as $n ([];
if $n|type == "string"
then . + [$n]
elif $n|type == "number" and length
then .[-1] += "[\($n)]"
else error("invalid path representation")
end) | join(".");
[ paths(scalars) as $p
| "\($p | pr2pe) == \(getpath($p) | tojson)" ]
| join(" && ")
查看您想创建一个查询以将其作为JSON对象吗?是的,完全正确-如果有帮助,我将尝试以编程方式围绕给定的JSON负载定义一个测试用例
jq -r '
. as $data |
[path(.. |
select(type != "object" and type != "array")
)] |
map(
. as $path |
map("[" + (. | tojson) + "]") |
join("") |
"request\(.) = \($data | getpath($path) | tojson)"
) |
join(" && ")
' < test.json
request["username"] = "billy" &&
request["hero"]["something"] = "goeshere" &&
request["bumper"]["bumper2"]["bumper3"] = "splodge" &&
request["morgan"][0]["abc"] = 123 &&
request["morgan"][1] = 2 &&
request["morgan"][2] = 4 &&
request["morgan"][3]["def"] = 567 &&
request["password"] = "issilly"
def pr2pe:
reduce .[] as $n ([];
if $n|type == "string"
then . + [$n]
elif $n|type == "number" and length
then .[-1] += "[\($n)]"
else error("invalid path representation")
end) | join(".");
[ paths(scalars) as $p
| "\($p | pr2pe) == \(getpath($p) | tojson)" ]
| join(" && ")