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(" && ")