簡體   English   中英

jq-將復雜的JSON解析為字符串

[英]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.barfoo["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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM