Unix baris perintah JSON parser? [Tutup]


128

Adakah yang bisa merekomendasikan parser JSON Unix (pilih selera Anda) yang dapat digunakan untuk mengintrospeksi nilai-nilai dari respons JSON dalam sebuah pipa?


Saya suka menggunakan pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart



1
Ada alat baru di kota: ramda-cli , yang menggunakan api kari Ramda dan sintaks LiveScript terse. Ini dibangun untuk mengambil json sebagai fungsi input dan penulisan. npm install -g ramda-cli
Ehvince

Jawaban:


18

Anda bisa menggunakan parser baris perintah ini (yang bisa Anda tambahkan ke alias bash jika Anda mau), menggunakan modul yang ada di inti Perl:

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'

1
Saya bingung dengan output dari ini. Outputnya meliputi panah gemuk (=>) antara kunci dan nilai. Ini bukan JSON.
Landon Kuhn

7
@ Landon: tidak, inputnya adalah JSON, dan outputnya adalah struktur data Perl asli, yang selanjutnya bisa Anda manipulasi lebih lanjut jika diperlukan. Maksud dari one-liner ini adalah menghasilkan data yang jauh lebih mudah dibaca.
Eter

1
Jika Anda menginginkan output JSON, Anda dapat menggunakan Perl one-liner ini:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov

232

Saya lebih suka python -m json.toolyang tampaknya tersedia per default pada kebanyakan * nix sistem operasi per default.

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

Tetapi harus dicatat bahwa ini akan mengurutkan semua kunci secara alfabet, yang merupakan atau bisa menjadi hal yang baik di mana json dihasilkan oleh beberapa bahasa yang menggunakan HashMaps yang tidak diurut ...


5
Jawaban yang diremehkan. Ini adalah alternatif baris perintah yang bagus jika tujuannya adalah untuk memvalidasi file JSON yang diberikan sebagai berisi JSON yang valid.
scorpiodawg

10
jawaban ini tidak menjelaskan cara memeriksa nilai kunci yang ditentukan.
Colin Su

8
@ColinSu tapi itu juga bukan pertanyaan awal. json.toolhanya tangan pendek untuk mencetak json cantik. Jika Anda perlu mengekstrak / memanipulasi data json dalam skrip shell, saya akan menggunakan jqyang benar-benar luar biasa pada apa yang dilakukan ...
muhqu

@ muhqu ya, saya tahu, saya menggunakan json.toolsepuluh kali sehari. Saya pikir saya salah membaca arti dari "introspeksi" dalam pertanyaan, terima kasih atas pendapat Anda.
Colin Su

1
IMMO ini adalah jawaban yang salah karena python json.toolhanya melakukan dua hal: validasi dan cantik-cetak json. Ini TIDAK mengintrospeksi nilai dalam json seperti jqhalnya.
Devy

144

Jika Anda mencari alat kompilasi C portabel:

http://stedolan.github.com/jq/

Dari situs web:

jq seperti sed untuk data JSON - Anda dapat menggunakannya untuk mengiris dan memfilter dan memetakan dan mengubah data terstruktur dengan kemudahan yang sama seperti sed , awk , grep , dan teman-teman memungkinkan Anda bermain dengan teks.

jq dapat memecah format data yang Anda miliki menjadi yang Anda inginkan dengan sedikit usaha, dan program untuk melakukannya seringkali lebih pendek dan lebih sederhana daripada yang Anda harapkan.

Tutorial : http://stedolan.github.com/jq/tutorial/
Manual : http://stedolan.github.com/jq/manual/
Unduh : http://stedolan.github.com/jq/download/


20
Jawaban terbaik di sini, imo. Tidak ada ketergantungan berat, dokumentasi kecil, kuat, bagus dan mudah untuk mencobanya. Terima kasih banyak untuk menyarankan ini!
FrozenCow

Di Ubuntu / Debian Anda bisa saja apt install jq.
Pablo A

Saya bertanya ini banyak-bulan lalu, dan telah belajar untuk mencintai jq.
Jé Queue

63

Saya telah membuat modul yang dirancang khusus untuk manipulasi JSON baris perintah:

https://github.com/ddopson/underscore-cli

  • FLEKSIBEL - Alat "swiss-army-knife" untuk memproses data JSON - dapat digunakan sebagai printer cantik sederhana, atau sebagai baris perintah Javascript penuh
  • KUAT - Mengekspos kekuatan penuh dan fungsionalitas underscore.js (plus underscore.string)
  • SEDERHANA - Memudahkan menulis JS one-liners mirip dengan menggunakan "perl -pe"
  • Dirantai - Invokasi perintah ganda dapat dirantai bersama untuk membuat pipa pemrosesan data
  • MULTI-FORMAT - Dukungan kaya untuk format input / output - pencetakan cantik, JSON ketat, dll [segera hadir]
  • DOKUMEN - Dokumentasi baris perintah yang luar biasa dengan banyak contoh untuk setiap perintah

Ini memungkinkan Anda melakukan hal-hal hebat dengan sangat mudah:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

Dan ia memiliki salah satu dari format JSON "smart-whitespace" terbaik:

Jika Anda memiliki permintaan fitur, komentari posting ini atau tambahkan masalah di github. Saya akan dengan senang hati memprioritaskan fitur yang dibutuhkan oleh anggota komunitas.


Luar biasa! Tetapi, apakah mungkin untuk menjalankan perintah konsol pada data JSON? Misalnya: diberi file JSON dengan array URL, wgetsetiap URL.
Camilo Martin

@CamiloMartin - cara termudah untuk melakukannya adalah mencetak URL, satu URL per baris, dan kemudian jalankan melalui xargs atau paralel GNU.
Dave Dopson

@DaveDopson Dapatkah saya menggunakan underscoreparsing nested json yang memiliki objek dan array yang bersarang?
user227666

1
@ user227666 - yakin. JSON mendukung bersarang banyak level objek. Atau Anda mungkin maksud JSON yang memiliki string yang menyandikan JSON lebih lanjut. Yang juga berfungsi, tetapi hanya memerlukan sedikit hijauing.
Dave Dopson

@DaveDopson Apakah menggarisbawahi dukungan "berisi" a "pola", yaitu. untuk "kunci" tertentu, set nilai (case-insenstitive) yang mungkin? Saya mencoba "jq" dengan korek api, tetapi tidak berhasil. Juga memposting kasus penggunaan lengkap saya di sini - stackoverflow.com/questions/25463196/…
ekta

13

Periksa TickTick .

Ini adalah parser Bash JSON sejati.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``

Harus menyukai alat level shell :)
Jé Queue

12

Mudah dipasang, di Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se

@ divideandconquer.se Maaf tetapi Anda menginstal alat ini menggunakan npm dengan npm install json.
gitaarik

@rednaw Sayangnya, paket NPM jsontampaknya diambil alih oleh paket yang sama sekali berbeda sekarang.
Brad

8

Adakah yang menyebut Jshon atau JSON.sh?

https://github.com/keenerd/jshon

pipe json untuk itu, dan itu melintasi objek json dan mencetak jalan ke objek saat ini (sebagai array JSON) dan kemudian objek, tanpa spasi.

http://kmkeen.com/jshon/
Jshon memuat teks json dari stdin, melakukan tindakan, kemudian menampilkan tindakan terakhir di stdout dan juga dibuat menjadi bagian dari pipa pemrosesan teks yang biasa.


Contoh penggunaan di OSX: brew install jshon,cat *.json | jshon
kenorb

2

Anda dapat mencoba jsawk seperti yang disarankan dalam jawaban ini .

Benar-benar Anda bisa menyiapkan skrip python cepat untuk melakukan ini.


1

Untuk Bash / Python , berikut ini adalah pembungkus dasar sekitar python simplejson:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

Ini benar-benar hanya menangani gaya data yang bersarang-kamus, tetapi berfungsi untuk apa yang saya butuhkan, dan berguna untuk berjalan melalui json. Mungkin bisa disesuaikan dengan selera.

Pokoknya, sesuatu yang dibuat sendiri bagi mereka yang tidak ingin sumber dalam ketergantungan eksternal lain. Kecuali python, tentu saja.

Ex. json_parser {field1} {field2}akan berjalan print myjson['{field1}']['{field2}'], menghasilkan kunci atau nilai yang terkait dengan {field2}, dipisahkan oleh spasi.


0

Saya baru saja membuat jkid yang merupakan penjelajah json command-line kecil yang saya buat untuk dengan mudah menjelajahi objek json besar. Objek dapat dieksplorasi "transversal" dan opsi "pratinjau" ada untuk menghindari konsol overflow.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}

Bagaimana saya bisa menginstal jkiddi mac?
user227666
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.