Saya memiliki file JSON members.json
seperti di bawah ini.
{
"took": 670,
"timed_out": false,
"_shards": {
"total": 8,
"successful": 8,
"failed": 0
},
"hits": {
"total": 74,
"max_score": 1,
"hits": [
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcf",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
},
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcG",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
}
]
}
}
Saya ingin menguraikannya menggunakan bash
skrip dapatkan hanya daftar bidang memberId
.
Output yang diharapkan adalah:
memberIds
-----------
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG
Saya mencoba menambahkan kode bash + python berikut ke .bashrc
:
function getJsonVal() {
if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then
echo "Usage: getJsonVal 'key' < /tmp/file";
echo " -- or -- ";
echo " cat /tmp/input | getJsonVal 'key'";
return;
fi;
cat | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["'$1'"]';
}
Dan kemudian memanggil:
$ cat members.json | getJsonVal "memberId"
Tapi itu melempar:
Traceback (most recent call last):
File "<string>", line 1, in <module>
KeyError: 'memberId'
python
, dan tidakbash
, adalah apa yang Anda gunakan untuk mengurai json. Misalnya, kesalahan itu tentu saja kesalahan python, bukan kesalahan bash.python
, tidak berarti tujuannya adalah untuk menggunakanpython
Jawaban:
Jika Anda akan menggunakan:
Anda dapat memeriksa struktur kamus bersarang
obj
dan memastikan bahwa baris asli Anda harus dibaca:ke elemen "memberId" itu. Dengan cara ini Anda dapat menjaga Python sebagai oneliner.
Jika ada beberapa elemen dalam elemen "hit" bersarang, maka Anda dapat melakukan sesuatu seperti:
Solusi Chris Down lebih baik untuk menemukan nilai tunggal untuk kunci (unik) di tingkat mana pun.
Dengan contoh kedua saya yang mencetak beberapa nilai, Anda mencapai batas apa yang harus Anda coba dengan satu liner, pada saat itu saya melihat sedikit alasan mengapa melakukan setengah dari pemrosesan dalam bash, dan akan pindah ke solusi Python lengkap .
sumber
Cara lain untuk melakukan ini di bash adalah menggunakan jshon . Berikut ini solusi untuk masalah Anda menggunakan
jshon
:The
-e
pilihan ekstrak nilai dari json tersebut. The-a
iterates atas array dan-u
decode string akhir.sumber
Nah, kunci Anda cukup jelas bukan pada akar objek. Coba sesuatu seperti ini:
Ini memiliki keuntungan tidak hanya dengan menyuntikkan sintaks ke Python, yang dapat menyebabkan kerusakan (atau lebih buruk, eksekusi kode arbitrer).
Anda dapat menyebutnya seperti ini:
sumber
Alternatif lain adalah jq :
sumber
Coba ini:
Jika Anda sudah memiliki
pretty printed
json, mengapa Anda tidak melakukannya sajagrep
?Anda selalu bisa mendapatkan format yang cukup dicetak dengan python simplejson untuk
grep
itu.Gunakan kesedihan:
Setelah itu, cukup
grep
hasilkan dengan pola 'memberId'.Untuk sepenuhnya tepat:
Pemakaian:
sumber
Mengikuti utas ini saya akan menggunakan json.tool dengan python:
python -m json.tool members.json | awk -F'"' '/memberId/{print $4}'
sumber
Menggunakan deepdiff Anda tidak perlu tahu kunci yang tepat:
sumber
Inilah solusi bash.
find_members.sh
tambahkan baris berikut ke file + save
chmod +x find_members.sh
Sekarang jalankan:
sumber