[英]jq - parsing complex JSON into a string
我正在嘗試使用jq
解析類似於以下內容的JSON:
{
"username": "billy",
"hero": {
"something": "goeshere"
},
"bumper": {
"bumper2": {
"bumper3": "splodge"
}
},
"morgan": [{
"abc": 123
}, 2, 4, {
"def": 567
}],
"password": "issilly"
}
成
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'
到目前為止,我必須
jq '. | to_entries[] | "request.\(.key) == '\(.value)'"'
這使我成為其中的一部分,但是我無法弄清楚如何“深入”到深層嵌套的元素中,也無法解決如何將生成的字符串連接到以'&&'分隔的單行中
paths(scalars)
輸出表示數組中字符串和數字路徑的數組.
,並使用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(" && ")
在jqplay上看到它
鑒於JavaScript不能區分foo.bar
和foo["bar"]
,這將給您輸出與您發布的內容完全不同的輸出,但應該足夠好。
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"
說明: ..
給我們所有價值; 但是我們只需要葉子值,所以我們過濾掉那些是數組或對象的值。 然后,我們使用[path()]
獲得路徑數組:這將是路徑步驟數組的數組,例如: [["username"], ["hero", "something"], ["bumper", "bumper2", "bumper3"], ["morgan", 0, "abc"]... ]
等。現在,對於每個路徑,我們都需要將每個路徑步驟括在方括號中,以獲取JavaScript可以理解的內容。 tojson
會給出括號所需的確切內容,以便對象的字符串鍵被加引號,而數組的整數鍵則不加引號。 現在我們可以放等式表達式:左側需要一個在我們構造的包圍式路徑之前的request
,而我們可以使用getpath
來獲取應該在右側的值(再次使用tojson
來獲取正確的文字) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.