Linux

從 jq 建構一個 json

  • November 9, 2021

我想在 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 格式。 etsvalue if 5which 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"
 ]
}

引用自:https://unix.stackexchange.com/questions/676771