Pesan kesalahan "Tidak dapat mengindeks array dengan string 'Judul'" saat mem-parsing data JSON dengan jq

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

Saya sudah mencoba pendekatan di bawah ini, tetapi mendapatkan kesalahan

Tidak dapat mengindeks array dengan string "Judul"

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

Saya mencoba pada baris yang sama dengan bagian lain, tetapi mendapatkan kesalahan yang sama.

Bagaimana saya mengatasi masalah ini?

Output yang diharapkan:

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

Jawaban:

12

Anda tidak mendapatkan Cannot index array with string "Title"dengan perintah itu, Anda mendapatkan

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

karena tidak ada characteristicsatau valuekunci dalam objek contentsarray (mereka adalah kunci dalam.details.Temperature sub-array).

Perintah yang akan memberi Anda pesan itu adalah:

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

atau

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

Kehilangan contentkunci pencarian, atau gagal mendapatkan elemen contentarray, menghasilkan array dari satu objek daripada objek itu sendiri. Dan Anda tidak dapat mengindeks array dengan string.


Dengan asumsi Anda menginginkan keluaran 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"

The <object(s)> as <variable>bertindak seperti loop dalam jq, sehingga apa yang terjadi di sini adalah bahwa $takan ditugaskan setiap elemen .details.Temperature[]pada gilirannya, dan untuk setiap elemen, sebuah array baru dibangun. Array dilewatkan @csvyang akan menghasilkan baris berformat CSV.

jqakan selalu menggandakan penawaran bidang output CSV-nya Untuk menghilangkan kutipan yang tidak perlu :

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

( csvformatadalah bagian dari csvkit)

Atau, Anda mungkin ingin menggunakan @tsvdi tempat @csvuntuk mendapatkan output tab-delimited sebagai gantinya.

Kusalananda
sumber
2
Kusal Terima kasih atas masukan Anda. Saya menggunakan hal di atas dengan untuk loop. detail di bawah ini. untuk bidang dalam sertifikasi Suhu; lakukan echo $ field :: jq --arg bidang "$ field" -r '.content [] | .details. "$ field" [] sebagai $ t | [.Title, .brand, $ t.value, $ t.characteristics] | @csv 'file.json selesai. tetapi mendapatkan "jq: error: try. [" field "] alih-alih .field untuk bidang yang tidak biasa bernama di <top-level>, baris 1:"
sam
Saya dapat ini, saya tidak dapat berkorelasi dan meletakkan .details. $ [Field] atau .details. "$ Field". Sekarang saya telah mengubahnya menjadi .details [$ field] [] dan sekarang berfungsi dengan baik.
sam
1
@sam Maaf, saya di tempat lain. Ya, .details[$field][]atau .["details"][$field][]sintaks yang benar.
Kusalananda
Saya telah memberikan suara dan terima kasih atas dukungan Anda.
sam
Kusal, maaf sudah mengganggumu lagi. Apakah mungkin untuk mendapatkan nilai utama konten tanpa memberikan nama bidang. "Judul", "merek", "ukuran", "tanggal" nilai. sesuatu seperti jq -r .content [] | dan itu memberi saya semua nilai utama seperti yang disebutkan di atas.
sam