Saya kenal dengan "jq" untuk parsing json.
Saya bekerja dengan satu layanan yang menghasilkan respons json di mana salah satu properti itu sendiri adalah string json. Bagaimana cara mengonversi nilai yang dikutip itu menjadi string json yang valid sehingga saya dapat memprosesnya dengan jq?
Sebagai contoh, jika saya hanya melihat json yang cukup dicetak dari "jq.", Berikut adalah kutipan singkat dari output:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Saya bisa menggunakan jq untuk mendapatkan nilai dari properti itu, tapi saya perlu mengubah string yang dikutip menjadi json yang valid dengan "unescaping" itu.
Saya kira saya bisa memasukkannya ke dalam sed, menghapus tanda kutip ganda yang membuka dan mengakhiri, dan menghapus semua garis miring terbalik (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
"). Tampaknya berhasil, tetapi itu sepertinya bukan solusi yang paling kuat.
Perbarui :
Agar sedikit lebih jelas tentang apa yang saya lakukan, berikut adalah beberapa contoh elided yang menunjukkan apa yang saya coba:
% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...
Perbarui :
Inilah contoh yang sepenuhnya mandiri:
% cat stuff.json | jq .
{
"stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"
Perbarui :
Jika saya mencoba untuk memproses output terakhir dengan ekspresi jq nyata, ia melakukan sesuatu seperti ini:
% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)
jq
untuk mendapatkan nilai dari properti string, apakah mengembalikannya tidak terhapus? Jika demikian, hanya pipa yang menjadi segar .jq
echo $(jq statement here)
?Jawaban:
Ada
raw
bendera untuk iniKeluaran
sumber
jq
untuk pemrosesan JSON lebih lanjut, sedangkan dengan pendekatan Roman Anda dapat melanjutkanjq
ekspresi yang sama .jq -rc '.stuff.date'
menghasilkanjq: error (at <stdin>:0): Cannot index string with string "date"
. Namun:.stuff | fromjson | .date
berfungsi dengan baik.Dengan
jq
'sfromjson
fungsi:stuff.json
Isi sampel :Hasil:
sumber