Saya memiliki file json berikut:
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
},
"BAZ": {
"name": "Jack",
"location": "Whereever"
}
}
Saya menggunakan jq dan ingin mendapatkan "nama" elemen dari objek di mana 'lokasi' adalah 'Stockholm'.
Saya tahu saya bisa mendapatkan semua nama dengan
cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"
Tapi saya tidak tahu bagaimana cara mencetak hanya objek-objek tertentu, mengingat nilai sub-kunci (di sini "location" : "Stockholm"
).
Untuk memperoleh aliran nama saja:
menghasilkan:
Untuk mendapatkan aliran pasangan (nama kunci, "nama" atribut) yang sesuai, pertimbangkan:
Keluaran:
sumber
name
variabel kunci (menggunakan fungsi shell dengan$1
sebagai parameter) tidak bekerja:termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'
. Saya menyebutnya seperticool_fn Name1
. Namun, ini bekerja:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
Saya memiliki pertanyaan terkait yang serupa: Bagaimana jika Anda ingin format objek asli kembali (dengan nama kunci, misalnya FOO, BAR)?
Jq menyediakan
to_entries
danfrom_entries
untuk mengkonversi antara objek dan array pasangan kunci-nilai. Itu bersama denganmap
sekitar pilihMenggunakan
with_entries
steno, ini menjadi:sumber
with_entries()
, Anda biasanya ingin juga menggunakan.value
dalamselect
klausa. Ini karenato_entries
makro mengubah entri yang diberikan ke.key
dan.value
memasangkan, yang juga terjadi denganwith_entries
.