jq에서 json 빌드

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값이 5int인 경우 따옴표가 필요하지 않지만 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필요한 작업에 따라 값도 생성되지 않습니다.

어떤 도움이라도 좋을 것입니다.

답변1

사용 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[@]}" )" )"

-pmake sat Pretty 옵션은 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

익명 배열을 만듭니다.

답변2

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"
  ]
}

관련 정보