jq를 사용하여 변수에서 중첩된 json 파일 만들기

jq를 사용하여 변수에서 중첩된 json 파일 만들기

변수를 저장하고 이를 사용하여 파일에 대한 json 출력을 생성하는 스크립트가 있습니다. 이것은 내 json 빌드 형식입니다.

#!/bin/bash
JSON_STRING=$(jq -n \
                  --arg configId "$configid" \
                  --arg objectname "tempfile" \
                  --arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
                  --arg test "2021" \
                   '$ARGS.named') > output.json
                  

필수 json o/p(output.json) -

{ "configId": "c8f", "objectname": "tempfile", "artifacts": [{ "name" : "oer", "version" : "1.01" }], "test" : "2021"}

여기서 예상되는 결과가 나오지 않습니다. 어떤 도움이라도 좋을 것입니다.

답변1

나는 두 단계로 그것을 할 것입니다: (편집: 아티팩트는 객체의 배열입니다)

inner=$(jq -n --arg name oer \
              --arg version "$ot" \
              '$ARGS.named'
)
final=$(jq -n --arg configId "$configid" \
              --arg objectname "tempfile" \
              --arg test "2021" \
              --argjson artifacts "[$inner]" \
              '$ARGS.named'
)
echo "$final"
{
  "configId": "c8f",
  "objectname": "tempfile",
  "artifacts": [
    {
      "name": "oer",
      "version": "1.01"
    }
  ],  "test": "2021"
}

-c최종 출력을 한 줄로 만들려면 .


답변2

명령줄에서 JSON을 생성하는 가장 안전한 방법은 JSON을 구축하는 도구를 사용하는 것입니다 jq. 그러나 중첩된 구조가 있으므로 별도의 호출로 jq하위 구조를 생성할 수도 있습니다.글렌 잭맨이 연기한.

시연한 내용을 한 번에 달성하는 또 다른 방법은 다음과 같습니다.

jq -n \
    --arg configId "$configid" \
    --arg objectname tempfile \
    --argjson artifacts "$( 
        jq -n \
            --arg name oer \
            --arg version "$ot" \
            '$ARGS.named'
    )" \
    --arg test 2021 \
    '$ARGS.named'

JSON 문서는 인코딩해야 하는 문자열이 아니라 JSON 문서이므로 내부에서 JSON 문서를 포함하는 --argjson대신 사용합니다 .--argjq

를 사용하면 jo약간의 입력 시간을 절약할 수도 있습니다.

jo  configId="$configid" \
    objectname=tempfile \
    artifacts="$( jo name=oer version="$ot" )" \
    test=2021

유틸리티에 대한 설명은 jo여기에서 찾을 수 있습니다.https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

답변3

출력을 변수에 저장하기 때문에 출력을 얻지 못하므로 파일로 리디렉션할 것이 없습니다. 다음을 수행할 수 있습니다.

variable=$(command)

아니면 이거:

command > file

variable=$(command) > file하지만 리디렉션할 항목이 없기 때문에 그렇게 할 수 없습니다 . 따라서 위의 코드가 실행되어 생성 및/또는 덮어쓰더라도 file명령의 출력을 변수에 저장했기 때문에 파일은 항상 비어 있습니다.

따라서 출력을 변수에 저장하고 파일에 저장하려면 다음과 같은 것이 필요합니다.

JSON_STRING=$(jq -n \
                  --arg configId "$configid" \
                  --arg objectname "tempfile" \
                  --arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
                  --arg test "2021" \
                   '$ARGS.named')
printf '%s\n' "$JSON_STRING" > output.json

답변4

artifactsJSON 배열로 취급되기를 원하는 것 같습니다 . 이 경우 --argjson대신 사용 --arg하고 따옴표를 수정하세요.

jq -n \
  --arg configId "$configid" \
  --arg objectname "tempfile" \
  --argjson artifacts "[{ \"name\" : \"oer\", \"version\" : \"$ot\" }]" \
  --arg test "2021" \
   '$ARGS.named'

결과는 다음과 같습니다.

{
  "configId": "",
  "objectname": "tempfile",
  "artifacts": [
    {
      "name": "oer",
      "version": "1.01"
    }
  ],
  "test": "2021"
}

관련 정보