Linux
從 jq 建構一個 json
我想在 jq 中生成一個 json 文件,如下所示:
{ "cpe": "dabb8fbd-d7be-4175-abb4-c628bb8cf1b5", "ps": [ "Obev" ], "ets": 5, "pMap": { "aik": ["1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"] }
這是我在 jq 中嘗試的 -
inner2=$(jq -n --arg aik "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" \ '$ARGS.named') res=$(jq -n --arg cpe "App" \ --arg ps "["Obev"]" \ --arg ets 5 \ --argjson pMap "$inner2" \ '$ARGS.named')
但它沒有按預期返回 JSON 格式。
ets
value if5
which is int 因此不需要引號,但它會生成一個pMap
像這樣生成的值"aik": {"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"}
這裡根據需要的操作格式沒有生成
ps
值也沒有按照所需的操作生成任何幫助都會很棒
使用
jo
(參見此處),這使得在命令行上創建 JSON 比創建 JSON 更容易jq
。它允許使用jo -a
.jo -p \ cpe='dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \ ps="$( jo -a Obev )" \ ets=5 \ pmap="$( jo aik="$( jo -a \ "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1" \ "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2" \ "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3" \ "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4" \ "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" )" )"
假設您使用的是具有數組的外殼,這就是數組
ets
的長度aik
:data=( "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" ) jo -p \ cpe='dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \ ps="$( jo -a Obev )" \ ets="${#data[@]}" \ pmap="$( jo aik="$( jo -a "${data[@]}" )" )"
make的
-p
選項可以漂亮地列印輸出,因此當您對文件的結構正確時感到滿意時將其刪除。jo
相應的
jq
命令,假設數組data
存在,是jq -n \ --arg cpe 'dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \ --argjson ps "$( jq -n '$ARGS.positional' --args Obev )" \ --arg ets "${#data[@]}" \ --argjson pmap "$( jq -n --argjson aik "$( jq -n '$ARGS.positional' --args "${data[@]}" )" \ '$ARGS.named' )" \ '$ARGS.named'
也就是說,使用
jq -n '$ARGS.positional' --args some arguments here
創建一個匿名數組。
您需要花更多時間閱讀 jq 手冊:https ://stedolan.github.io/jq/manual/
values=( "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4" "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" ) inner=$(jq -n --args '{aik: $ARGS.positional}' "${values[@]}") echo "$inner"
{ "aik": [ "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" ] }