jq를 사용하여 JSON 데이터를 구문 분석할 때 "'Title' 문자열로 배열을 인덱싱할 수 없습니다"라는 오류 메시지가 나타납니다.

jq를 사용하여 JSON 데이터를 구문 분석할 때 "'Title' 문자열로 배열을 인덱싱할 수 없습니다"라는 오류 메시지가 나타납니다.
{
    "content": [
    {
        "Title": "abc",
        "brand": "xyz",
        "size": "5 g",
        "date": "2019-01-01",
        "details": {
            "Temperature": [
            {
                "value": "90",
                "characteristics":"Normal"
            },
            {
                "value":"100",
                "characteristics":"high"
            },

            {
                "value":"80",
                "characteristics":"low"
            }
            ],

            "certifications": [
            {
                "value": "based",
                "characteristics":"pass"
            },

            {
                "value": "50",
                "characteristics":"failed"
            }
            ]
        },

         "formats": {
            "city": "NYC",
            "id": "007",
            "manufacture":""
            },
        "innerDetails": [
        {
            "contains": "abc",
            "panel":"xyz",
            "values":[
                {
                    "name":"abc",
                    "value":"10"
                },
                {
                    "name":"xyz",
                    "value":"20"
                }
                ]
            }
        ]
}
]
}

다음을 시도했지만 오류가 발생합니다.

문자열 'Title'을 사용하여 배열을 인덱싱할 수 없습니다.

jq -r '.content[]|[.Title,.brand,.characteristics,.value]' $jsonfile.

다른 부분과 같은 줄에서 시도했지만 동일한 오류가 발생했습니다.

이 문제를 어떻게 해결할 수 있나요?

예상 출력:

abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low

답변1

Cannot index array with string "Title"당신 은 이 명령을 받지 못합니다 .

[
  "abc",
  "xyz",
  null,
  null
]

배열의 객체에 또는 키가 없기 때문입니다 characteristics(하위 배열의 키임).valuecontents.details.Temperature

명령회의당신에게 보내는 메시지는 다음과 같습니다:

jq -r '.[] | [.Title,.brand,.characteristics,.value]' "$jsonfile"

또는

jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"

키 조회가 누락되거나 content배열 요소를 가져오는 데 실패하면 content객체 자체가 아닌 객체를 포함하는 배열이 생성됩니다. 그리고 문자열로는 배열을 인덱싱할 수 없습니다.


CSV 출력을 원한다고 가정해 보겠습니다.

$ jq -r '.content[] | .details.Temperature[] as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
"abc","xyz","90","Normal"
"abc","xyz","100","high"
"abc","xyz","80","low"

이는 <object(s)> as <variable>루프처럼 동작하므로 jq여기서 일어나는 일은 $t각 요소가 차례로 할당되고 .details.Temperature[]각 요소에 대해 새 배열이 구성된다는 것입니다. 전달된 배열은 @csvCSV 형식으로 행을 출력합니다.

jqCSV 출력에서는 필드가 항상 큰따옴표로 묶입니다. 없애기 위해불필요한인용 부호:

jq -r '...as above...' file.json | csvformat

( csvformat의 일부입니다csvkit)

또는 탭으로 구분된 출력을 얻기 @tsv위해 대신 in을 사용할 수도 있습니다 .@csv

관련 정보