Gunakan jq untuk mengurai String JSON

91

Saya mencoba jqmengurai struktur JSON seperti:

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

Artinya, elemen dalam JSON adalah string dengan json yang lolos.

Jadi, saya memiliki sesuatu di sepanjang garis $ jq [.c] myFile.json | jq [.id]

Tapi itu bertentangan dengan jq: error: Cannot index string with string

Ini karena keluaran dari .c adalah string, bukan JSON lainnya. Bagaimana cara mendapatkan jq untuk mengurai string ini?

Solusi awal saya adalah menggunakan sed untuk mengganti semua karakter escape ( \":\", \",\"dan \") tapi itu berantakan, saya berasumsi ada cara jquntuk melakukan ini?

Terima kasih!

edit: Juga, versi jq yang tersedia di sini adalah:

$ jq --version
jq version 1.3

Saya kira saya bisa memperbaruinya jika diperlukan.

Colin Grogan
sumber
Pertanyaan ini juga membantu jika Anda mencari: "Bagaimana cara membuka string json menggunakan jq?"
k0pernikus

Jawaban:

172

jq memiliki bawaan fromjsonuntuk ini:

jq '.c | fromjson | .id' myFile.json

fromjson telah ditambahkan di versi 1.4.

jwodder
sumber
2
Terima kasih. Ini bekerja. Saya akan menerima jawaban ini, karena ini lebih 'idiomaitic' yang saya rasakan. Bersulang.
Colin Grogan
@ColinGgan tolong lakukan.
vbence
@ColinGrogan: Saya tidak melihat alasan untuk mengubah jawaban yang diterima karena Anda dengan jelas menulis dalam pertanyaan Anda bahwa Anda menggunakan versi 1.3 dari jq di mana fromjsonfitur tersebut tidak tersedia. Dengan kata lain, meskipun jawaban ini menarik, itu tidak menjawab pertanyaan itu.
Casimir et Hippolyte
Apakah mungkin untuk menggunakan ini tetapi pada seluruh file json (tidak menentukan properti .id)?
Florian Castelain
1
@FlorianCastelain ya, hilangkan atau gunakan dot jq 'fromjson | .' myfile"{\"key\":1, \"word\":\"cat\"}"
42

Anda dapat menggunakan keluaran mentah (-r) yang akan menghilangkan karakter:

jq -r .c myfile.json | jq .id

TAMBAHAN: Ini memiliki keuntungan karena berfungsi di jq 1.3 dan lebih tinggi; memang, itu harus bekerja di setiap versi jq yang memiliki opsi -r.

Casimir et Hippolyte
sumber