Apakah ada skrip shell (Unix) untuk memformat JSON dalam bentuk yang dapat dibaca manusia?
Pada dasarnya, saya ingin mengubah yang berikut:
{ "foo": "lorem", "bar": "ipsum" }
... menjadi sesuatu seperti ini:
{
"foo": "lorem",
"bar": "ipsum"
}
json
perpustakaan python sendiri , tapi saya menambahkan pygments juga untuk mendapatkan highlight sintaks.Jawaban:
Dengan Python 2.6+ Anda bisa melakukannya:
atau, jika JSON ada dalam file, Anda dapat melakukan:
jika JSON berasal dari sumber internet seperti API, Anda dapat menggunakan
Untuk kenyamanan dalam semua kasus ini, Anda dapat membuat alias:
Untuk kenyamanan lebih dengan mengetik lebih banyak agar siap:
untuk semua kasus di atas. Anda dapat memasukkan ini ke dalam
.bashrc
dan itu akan tersedia setiap saat di shell. Meminta itu sepertiprettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.sumber
pygmentize -l javascript
untuk mendapatkan keluaran berwarna sintaks di baris perintah Anda. Sunting : Jika Anda memiliki pygments yang terinstal.alias pretty='python -mjson.tool | pygmentize -l json
sehingga saya hanya dapat menjalankan:command params | pretty
. Semoga ini membantu. PS: Jika ada yang berhasil memperluas ini ke a) menghapus curl-output yang saya lihat setiap waktu dan / atau b) JANGAN mengurutkan kunci json; tolong beri tahu saya, saya akan sangat berterima kasih.Kamu bisa menggunakan:
jq
Ini sangat sederhana untuk digunakan dan bekerja dengan sangat baik! Ini dapat menangani struktur JSON yang sangat besar, termasuk aliran. Anda dapat menemukan tutorialnya di sini .
Contoh penggunaan:
. adalah filter identitas.
sumber
--sort-keys
opsi, yang bermanfaat dalam beberapa kasus.curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
.<<<
operator - persis apa yang saya cari.Saya menggunakan argumen "spasi"
JSON.stringify
untuk mencetak JSON dalam JavaScript.Contoh:
Dari baris perintah Unix dengan Node.js, tentukan JSON pada baris perintah:
Pengembalian:
Dari baris perintah Unix dengan Node.js, tentukan nama file yang berisi JSON, dan menggunakan indentasi empat spasi:
Menggunakan pipa:
sumber
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
juga menampilkan hasilnya ke STDOUT.Saya menulis alat yang memiliki salah satu format "smart whitespace" terbaik yang tersedia. Ini menghasilkan lebih banyak keluaran yang dapat dibaca dan lebih sedikit verbose daripada kebanyakan opsi lain di sini.
garis bawah-cli
Seperti inilah bentuk "smart whitespace":
Saya mungkin sedikit bias, tetapi ini adalah alat yang luar biasa untuk mencetak dan memanipulasi data JSON dari baris perintah. Sangat ramah untuk digunakan dan memiliki bantuan / dokumentasi baris perintah yang luas. Ini pisau Swiss Army yang saya gunakan untuk 1001 tugas kecil berbeda yang secara mengejutkan akan menyebalkan untuk melakukan cara lain.
Kasus penggunaan terbaru: Chrome, konsol Dev, tab Jaringan, ekspor semua sebagai file HAR, "cat site.har | underscore pilih '.url' --outfmt text | grep mydomain"; sekarang saya memiliki daftar semua URL pengambilan yang dibuat secara kronologis selama pemuatan situs perusahaan saya.
Pencetakan cantik itu mudah:
Hal yang sama:
Hal yang sama, lebih eksplisit:
Alat ini adalah proyek hasrat saya saat ini, jadi jika Anda memiliki permintaan fitur, ada peluang bagus saya akan mengatasinya.
sumber
[32m
,[33m
,[39m
bersama dengan beberapa non-printable sebelum setiap dari mereka, yang membuat JSON tidak valid. Namun, cetak garis bawah saja tidak menambahkan apa pun ke file dan melakukan pekerjaan pemformatannya dengan sempurna.jq
tapi ini bekerja dengan baik untuk "JSON" saya yang tidak memiliki kunci ganda.Saya biasanya hanya melakukan:
Dan untuk mengambil data pilih (dalam hal ini, nilai "test"):
Jika data JSON ada dalam file:
Jika Anda ingin melakukan semuanya sekaligus
curl
pada baris perintah menggunakan token otentikasi:sumber
| prettyjson
Berkat petunjuk JF Sebastian yang sangat membantu, berikut ini skrip yang sedikit ditingkatkan:
sumber
dict
objek normal tidak memiliki urutan yang ditentukan. Cobajson.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
dan Anda akan menemukan mereka ditukar. Untuk memperbaikinya, imporOrderedDict
danload
lewatiobject_pairs_hook=OrderedDict
.inputFile = sys.stdin
. Ini memungkinkan Anda menyalurkan barang ke skrip seperti:curl http://somewhere.com/foo.json | pp_json.py
from collections import OrderedDict
.com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))"
Perhatikan bahwa pemisah harus ditetapkan sebagai (',', ':') untuk menghindari trailing spasi yang ditambahkan: bugs.python.org/issue16333sort_keys = True
sebagai gantinya, karena saya ingin menggunakan ini untuk membandingkan file json dan itu berfungsi seperti pesona.Jika Anda menggunakan npm dan Node.js, Anda dapat melakukan
npm install -g json
dan kemudian mengirimkan perintahjson
. Lakukanjson -h
untuk mendapatkan semua opsi. Itu juga bisa mengeluarkan bidang tertentu dan mewarnai hasilnya dengan-i
.sumber
Ini tidak terlalu sederhana dengan cara asli dengan alat jq .
Sebagai contoh:
sumber
jq . file.json
:; tetapi jugacat file.json | jq
(tanpa filter.
) juga berfungsi. (di ubuntu / linux; ymmv lintas platform)Dengan Perl, gunakan modul CPAN
JSON::XS
. Itu menginstal alat baris perintahjson_xs
.Mengesahkan:
Prettify file JSON
src.json
kepretty.json
:Jika belum
json_xs
, cobajson_pp
. "pp" adalah untuk "perl murni" - alat ini diimplementasikan dalam Perl saja, tanpa mengikat ke perpustakaan C eksternal (yang merupakan singkatan XS, "Sistem Perpanjangan" Perl).sumber
-t null
memberi saya null: bukan toformat yang valid ... tetapi membiarkannya bekerja dengan baik. Terima kasih.Pada * nix, membaca dari stdin dan menulis ke stdout bekerja lebih baik:
Masukkan ini dalam file (saya beri nama saya "prettyJSON" setelah jawaban AnC ) di PATH Anda dan
chmod +x
itu, dan Anda baik-baik saja.sumber
fileinput.input()
membaca dari stdin jika tidak ada file yang diberikan pada command-line. ContohJSON Ruby Gem dibundel dengan skrip shell untuk membuat JSON cantik:
Unduh skrip: gist.github.com/3738968
sumber
json.tool
. Namun, tampaknya juga memiliki batasan kedalaman bersarang (nesting of 20 is too deep (JSON::NestingError)
).sudo apt-get install ruby-json-pure
alih-alihgem install
prettify_json.rb
?~/bin
folder (pastikan itu di PATH Anda) mengubah namaprettify_json.rb
untukppj
dan menjalankanchmod +x ppj
. Sekarang Anda dapat melakukan sesuatu seperticurl www.jsonsring.com/something.json | ppj
PEMBARUAN Saya menggunakan
jq
sekarang seperti yang disarankan dalam jawaban lain. Ini sangat kuat dalam memfilter JSON, tetapi, pada dasarnya, juga merupakan cara yang mengagumkan untuk mencetak JSON dengan cantik untuk dilihat.jsonpp adalah baris perintah JSON printer yang sangat bagus.
Dari README:
Jika Anda menggunakan Mac OS X, Anda bisa
brew install jsonpp
. Jika tidak, Anda cukup menyalin biner ke suatu tempat di$PATH
.sumber
python -mjson.tool
(dari jawaban lain di sini) dan butuh 10-20sec ...json_pp
- yang memformat json dengan baik, meskipun terlepas dari kesamaan dalam penamaan, saya percaya ini menjadi proyek yang sama sekali berbeda dari yangjsonpp
disebutkan di siniBegitulah cara saya melakukannya:
Ini lebih pendek kode dan menyelesaikan pekerjaan.
sumber
skrip bash sederhana untuk pencetakan json cantik
json_pretty.sh
Contoh:
sumber
%*c
notasi jadi saya mengubahprintf
kec=0; while (c++<offset) printf " "; printf $0;
. Dan awk saya memiliki regex yang berbeda dan backslash tidak berfungsi[]
. Saya mengubah regex menjadi/^[[{]/
dan/[]}]/
.grep
yang terhapus secara tidak sengaja;)Coba
pjson
. Ini memiliki warna!Instal dengan
pip
:⚡ pip install pjson
Dan kemudian pipa konten JSON untuk
pjson
.sumber
CATATAN: Ini bukan yang cara untuk melakukannya.
Hal yang sama di Perl:
Catatan 2: Jika Anda menjalankan
kata yang mudah dibaca menjadi dikodekan
Jika sisa pipeline Anda akan menangani unicode dengan anggun dan Anda ingin JSON Anda juga ramah manusia, cukup gunakan
ensure_ascii=False
dan Anda akan mendapatkan:
sumber
to_json
sepertinya tidak menerima opsi. Tetapi ini berhasil:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
.json.tool
contoh kode. 1. versi ini memungkinkan Anda untuk mengubah beberapa parameter misalnya,indent
2. Pada saat posting (2008) Python 2.4 masih digunakan yang tidak mendukung-mjson.tool
Saya menggunakan jshon untuk melakukan apa yang Anda gambarkan. Lari saja:
Anda juga bisa memberikan argumen untuk mengubah data JSON.
sumber
Atau, dengan Ruby:
sumber
to_json
metode kustom ;Kernel#jj
hanya array cetak cantik dan hash yang sama (atau angka / string / boolean).echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Lihat Jazor . Ini adalah parser JSON baris perintah sederhana yang ditulis dalam Ruby.
sumber
curl
dan ini adalah satu-satunya yang melakukannya untuk saya.Anda dapat menggunakan perintah sederhana ini untuk mencapai hasil:
sumber
JSONLint memiliki implementasi open-source pada GitHub yang dapat digunakan pada baris perintah atau termasuk dalam proyek Node.js.
lalu
atau
sumber
Cukup pipa output ke
jq .
.Contoh:
sumber
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
jika Anda berada di mac os.jq .
untuk pencetakan-cantik memiliki satu kelemahan potensial : semua versi jq yang masih ada bersikeras memperlakukan nomor JSON sebagai angka IEEE, sehingga presisi mudah hilang, misalnya untuk bilangan bulat yang sangat besar.cat file |
selalu merupakan pemborosan dari suatu proses; lakukan sajajq . <file_name.txt >output_name.txt
(dengan huruf<
dan>
karakter).Dengan Perl, jika Anda menginstal JSON :: PP dari CPAN Anda akan mendapatkan perintah json_pp . Mencuri contoh dari B Bycroft Anda dapatkan:
Perlu disebutkan bahwa
json_pp
sudah diinstal sebelumnya dengan Ubuntu 12.04 (setidaknya) dan Debian/usr/bin/json_pp
sumber
Menghitung harga
Saya menggabungkan json.tool Python dengan pyratingize:
Ada beberapa alternatif untuk menghitung yang tercantum dalam jawaban saya ini .
Ini demo langsung:
sumber
pygmentize -l json
untuk mendapatkan pewarnaan.python-pygments
, yaituapt-get install python-pygments
Saya sarankan menggunakan utilitas baris perintah json_xs yang termasuk dalam modul perl JSON :: XS. JSON :: XS adalah modul Perl untuk membuat serialisasi / deserialisasi JSON, pada mesin Debian atau Ubuntu Anda dapat menginstalnya seperti ini:
Ini jelas juga tersedia di CPAN .
Untuk menggunakannya untuk memformat JSON yang diperoleh dari URL Anda dapat menggunakan curl atau wget seperti ini:
atau ini:
dan untuk memformat JSON yang terkandung dalam file Anda dapat melakukan ini:
Untuk memformat ulang sebagai YAML , yang oleh sebagian orang dianggap lebih dapat dibaca secara manusiawi daripada JSON:
sumber
Anda cukup menggunakan alat standar seperti jq atau json_pp.
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
atau
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
akan baik hasil prettify seperti berikut (jq bahkan lebih berwarna):
Keuntungan besar dari jq adalah ia dapat melakukan BANYAK lebih banyak jika Anda ingin mengurai dan memproses json.
sumber
jj sangat cepat, dapat menangani dokumen JSON ginormous secara ekonomis, tidak mengacaukan dengan nomor JSON yang valid, dan mudah digunakan, mis.
atau
Ini (2018) masih cukup baru sehingga mungkin tidak akan menangani JSON yang tidak valid seperti yang Anda harapkan, tetapi mudah untuk menginstal pada platform utama.
sumber
brew install jq
command + | jq
curl localhost:5000/blocks | jq
:)sumber
bat
adalahcat
klon dengan penyorotan sintaks:Contoh:
-p
akan menampilkan tanpa header, dan-l
secara eksplisit akan menentukan bahasa.Ini memiliki pewarnaan dan pemformatan untuk JSON dan tidak memiliki masalah yang dicatat dalam komentar ini: Bagaimana saya bisa mencetak JSON dalam skrip shell?
sumber
Instal yajl-tools dengan perintah di bawah ini:
sudo apt-get install yajl-tools
kemudian,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
sumber