Bagaimana saya bisa mencetak JSON dalam skrip shell?

3061

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"
}
AnC
sumber
7
Saya memutar sendiri beberapa saat yang lalu: github.com/exhuma/braindump/tree/master/jsonformat Kode ini sangat sederhana, menggunakan jsonperpustakaan python sendiri , tapi saya menambahkan pygments juga untuk mendapatkan highlight sintaks.
exhuma
Tersandung pada ini tetapi kemudian menemukan Json Pretty dan saya sangat menyukainya. Typekit menggunakannya dalam contoh API mereka, jadi ada beberapa klout di belakangnya ^^
Nick Tomlin
Jika Anda tidak keberatan menyalin paste, ada juga beberapa alat sederhana online seperti jsonprettyprint.net di mana Anda dapat dengan cepat mencetak JSON mentah Anda.
Javaaaa
7
Diperingatkan: python -m json.tool tidak selalu menghasilkan JSON yang valid. (Petunjuk: 1e1000)
puncak

Jawaban:

4462

Dengan Python 2.6+ Anda bisa melakukannya:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

atau, jika JSON ada dalam file, Anda dapat melakukan:

python -m json.tool my_json.json

jika JSON berasal dari sumber internet seperti API, Anda dapat menggunakan

curl http://my_url/ | python -m json.tool

Untuk kenyamanan dalam semua kasus ini, Anda dapat membuat alias:

alias prettyjson='python -m json.tool'

Untuk kenyamanan lebih dengan mengetik lebih banyak agar siap:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

untuk semua kasus di atas. Anda dapat memasukkan ini ke dalam .bashrcdan itu akan tersedia setiap saat di shell. Meminta itu seperti prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

campovski
sumber
73
Anda dapat menyalurkannya ke pygmentize -l javascriptuntuk mendapatkan keluaran berwarna sintaks di baris perintah Anda. Sunting : Jika Anda memiliki pygments yang terinstal.
Shrikant Sharat
177
Sebuah jawaban yang bagus, hanya mengingatkan saya miliki dengan itu itu tidak semacam tombol pada output - yang mungkin Anda butuhkan untuk menjadi sadar.
Chris Nash
14
Di myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu
40
Ini tampaknya melepaskan karakter Unicode ke \ uXXXX, yang mungkin merugikan.
user1071136
14
Saya telah membuat sebuah alias: alias pretty='python -mjson.tool | pygmentize -l jsonsehingga 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.
Clint Eastwood
1023

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:

$ jq --color-output . file1.json file1.json | less -R

$ command_with_json_output | jq .

$ jq . # stdin/"interactive" mode, just enter some JSON

$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

. adalah filter identitas.

Vita Pluvia
sumber
11
Ada juga --sort-keysopsi, yang bermanfaat dalam beberapa kasus.
Matthew Flaschen
9
Bekerja dengan curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Arahkan kursor
19
"jq." sangat bagus sebagai printer cantik, tetapi dilengkapi dengan peringatan: jq (hingga dan termasuk jq versi 1.5) akan mengubah nilai angka yang sangat besar dan sangat kecil karena mengurai nilai numerik sebagai nilai IEEE 754 64-bit. Untuk memeriksa apakah printer cantik favorit Anda memiliki masalah yang sama, coba nilai ini: 1e1000. Perhatikan bahwa python -mjson.tool gagal dalam tes ini karena menghasilkan Infinity, yang bahkan bukan JSON.
puncak
1
Sebagai catatan, Anda dapat mengarahkan hasil diformat ke file: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Chad
26
@ Meekohi alternatifnya adalah "tidak perlu menggunakan gema". Super senang telah menemukan <<<operator - persis apa yang saya cari.
jchook
381

Saya menggunakan argumen "spasi" JSON.stringifyuntuk mencetak JSON dalam JavaScript.

Contoh:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

Dari baris perintah Unix dengan Node.js, tentukan JSON pada baris perintah:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

Pengembalian:

{
    "foo": "lorem",
    "bar": "ipsum"
}

Dari baris perintah Unix dengan Node.js, tentukan nama file yang berisi JSON, dan menggunakan indentasi empat spasi:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json

Menggunakan pipa:

echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
 s=process.openStdin();\
 d=[];\
 s.on('data',function(c){\
   d.push(c);\
 });\
 s.on('end',function(){\
   console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
 });\
"
Krinkle
sumber
10
Untuk debugging objek di Node.js, Anda harus benar-benar menggunakan sys.inspect () alih-alih JSON.stringify (). Inilah alasannya: markhansen.co.nz/inspecting-with-json-stringify
Gurpartap Singh
11
Diturunkan. OP adalah tentang "* skrip baris perintah nix" dan jawaban ini adalah konteks yang berbeda.
danorton
49
@danorton: JS dapat digunakan dari commandline melalui node.js dan solusi serupa lainnya.
calvinf
10
Tidak perlu untuk konsol: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"juga menampilkan hasilnya ke STDOUT.
Julian D.
2
Menyebalkan bahwa skripnya berbeda untuk nama file vs. stdin
Lukasz Wiktor
340

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:

underscore -i data.json print

Hal yang sama:

cat data.json | underscore print

Hal yang sama, lebih eksplisit:

cat data.json | underscore print --outfmt pretty

Alat ini adalah proyek hasrat saya saat ini, jadi jika Anda memiliki permintaan fitur, ada peluang bagus saya akan mengatasinya.

Dave Dopson
sumber
4
Saya juga memperbarui ~ / .bash_profile saya dengan baris berikut: alias underscor = 'underscore print --outfmt pretty' sekarang saya bisa melakukan curl example.com/result.json | menggarisbawahi dan masih menggunakan garis bawah untuk pemformatan lainnya
Gal Bracha
Terima kasih Dave! Alat itu bagus! alias pretty-json = "cantik di bawah" dan hasil curl menyenangkan mata
Maxim Ponomarev
Alat pemformatan yang bagus, hanya satu catatan: meneruskan keluaran ke file (baik dengan opsi -o atau dengan > ) hanya berfungsi dengan cetak garis bawah . garis bawah cukup menyimpan file dengan tanda-tanda format warna yang dimasukkan, bertiga seperti: [32m, [33m, [39mbersama 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.
tiurin
Saya suka jqtapi ini bekerja dengan baik untuk "JSON" saya yang tidak memiliki kunci ganda.
Bluu
@DaveDopson terima kasih atas alat hebatnya !! Akan mencoba menggunakannya bersama jsonselect.org/#tryit ...
mycargus
173

Saya biasanya hanya melakukan:

echo '{"test":1,"test2":2}' | python -mjson.tool

Dan untuk mengambil data pilih (dalam hal ini, nilai "test"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Jika data JSON ada dalam file:

python -mjson.tool filename.json

Jika Anda ingin melakukan semuanya sekaligus curlpada baris perintah menggunakan token otentikasi:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
locojay
sumber
jika json seharusnya datang langsung dari http api ini juga merupakan alat yang bagus diimplementasikan dalam python: github.com/jkbr/httpie
Florian
Jika Anda telah menginstal node (dan tidak keberatan output gaya YAML) ada juga paket ini: rafeca.com/prettyjson sehingga Anda dapat mengakhiri keriting dengan | prettyjson
Iolo
3
Seperti disebutkan di atas, salah satu masalah dengan python -mjson.tool sebagai printer cantik JSON adalah tidak selalu memancarkan JSON. Misalnya 1e1000 menjadi Infinity (apakah menggunakan python 2.x atau 3.x). 'jq.' selalu menghasilkan JSON, tetapi tidak menjamin bahwa nilai yang sangat besar (atau sangat kecil) tetap dipertahankan.
puncak
88

Berkat petunjuk JF Sebastian yang sangat membantu, berikut ini skrip yang sedikit ditingkatkan:

#!/usr/bin/python

"""
Convert JSON data to human-readable form.

Usage:
  prettyJSON.py inputFile [outputFile]
"""

import sys
import simplejson as json


def main(args):
    try:
        if args[1] == '-':
            inputFile = sys.stdin
        else:
            inputFile = open(args[1])
        input = json.load(inputFile)
        inputFile.close()
    except IndexError:
        usage()
        return False
    if len(args) < 3:
        print json.dumps(input, sort_keys = False, indent = 4)
    else:
        outputFile = open(args[2], "w")
        json.dump(input, outputFile, sort_keys = False, indent = 4)
        outputFile.close()
    return True


def usage():
    print __doc__


if __name__ == "__main__":
    sys.exit(not main(sys.argv))
AnC
sumber
3
Ketika nilai-nilai dimuat ke dalam kamus, urutannya hilang: dictobjek normal tidak memiliki urutan yang ditentukan. Coba json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)dan Anda akan menemukan mereka ditukar. Untuk memperbaikinya, impor OrderedDictdan loadlewati object_pairs_hook=OrderedDict.
icktoofay
Anda dapat mengubah script untuk membaca dari input standar dengan ini: inputFile = sys.stdin. Ini memungkinkan Anda menyalurkan barang ke skrip seperti:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson
1
Dan untuk menghindari menyortir dengan @ icktoofay ini komentar, impor OrderedDict seperti ini: from collections import OrderedDict.
Hugo
2
Terima kasih @icktoofay. Ini memungkinkan saya untuk membuat fungsi vim berikut: 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/issue16333
blindsnowmobile
Cuplikan hebat! Saya telah menggunakan sort_keys = Truesebagai gantinya, karena saya ingin menggunakan ini untuk membandingkan file json dan itu berfungsi seperti pesona.
JL Peyret
81

Jika Anda menggunakan npm dan Node.js, Anda dapat melakukan npm install -g jsondan kemudian mengirimkan perintah json. Lakukan json -huntuk mendapatkan semua opsi. Itu juga bisa mengeluarkan bidang tertentu dan mewarnai hasilnya dengan -i.

curl -s http://search.twitter.com/search.json?q=node.js | json
gregers
sumber
79

Ini tidak terlalu sederhana dengan cara asli dengan alat jq .

Sebagai contoh:

cat xxx | jq .
Peter Mortensen
sumber
7
PERINGATAN: jq mengkodekan angka sebagai IEEE 754 64-bit mengapung, dan dengan demikian representasi mereka cenderung berubah. Ketepatan angka yang sangat kecil dan sangat besar kemungkinan akan hilang. Untuk memeriksa apakah printer cantik favorit Anda memiliki masalah yang sama, coba nilai ini: 1e1000.
puncak
5
atau hanya jq . file.json:; tetapi juga cat file.json | jq(tanpa filter .) juga berfungsi. (di ubuntu / linux; ymmv lintas platform)
michael
73

Dengan Perl, gunakan modul CPAN JSON::XS. Itu menginstal alat baris perintah json_xs.

Mengesahkan:

json_xs -t null < myfile.json

Prettify file JSON src.jsonke pretty.json:

< src.json json_xs > pretty.json

Jika belum json_xs, coba json_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).

knb
sumber
9
Tampaknya menjadi standar dengan Cygwin!
Janus Troelsen
13
json_pp dapat digunakan dengan cara yang sama dan kemungkinan besar sudah siap diinstal pada sistem Anda (pada Debian itu ada dalam paket 'perl').
MichielB
8
FYI, pada sistem Mac OS X 10.9 saya, json_pp tersedia secara otomatis.
Gregg Williams
-t nullmemberi saya null: bukan toformat yang valid ... tetapi membiarkannya bekerja dengan baik. Terima kasih.
Lucas
pp adalah untuk perl murni, tidak cukup cetak di sini :) Karena json_xs dan json_pp dapat melakukan lebih dari sekedar mencetak cantik dan juga dengan -json_opt melakukan hal-hal lain alih-alih pencetakan cantik. Meskipun pencetakan cantik adalah perilaku default.
Kjetil S.
70

Pada * nix, membaca dari stdin dan menulis ke stdout bekerja lebih baik:

#!/usr/bin/env python
"""
Convert JSON data to human-readable form.

(Reads from stdin and writes to stdout)
"""

import sys
try:
    import simplejson as json
except:
    import json

print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)

Masukkan ini dalam file (saya beri nama saya "prettyJSON" setelah jawaban AnC ) di PATH Anda dan chmod +xitu, dan Anda baik-baik saja.

Daryl Spitzer
sumber
Memang, menggunakan stdin / stdout jauh lebih fleksibel dan sederhana. Terima kasih telah menunjukkannya.
AnC
3
Untuk program yang mengharapkan file bernama, gunakan / dev / stdin, ditto for out dan err.
dvogel
4
FYI fileinput.input()membaca dari stdin jika tidak ada file yang diberikan pada command-line. Contoh
jfs
fileinput.input () tidak dapat menangani dengan baik file tanpa baris baru di akhir, terakhir kali saya memeriksa.
Zachary Vance
ia bertanya dalam skrip shell, bukan python bahasa lain. Dengan JQ bisa melakukannya dengan sempurna.
Bui Anh Tuan
65

JSON Ruby Gem dibundel dengan skrip shell untuk membuat JSON cantik:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

Unduh skrip: gist.github.com/3738968

Paul Horsfall
sumber
6
Perhatikan bahwa solusi ini mendekode urutan pelepasan unicode "\ uxxxx", tidak seperti Python json.tool. Namun, tampaknya juga memiliki batasan kedalaman bersarang ( nesting of 20 is too deep (JSON::NestingError)).
a3nm
2
di Ubuntu Anda dapat melakukan: sudo apt-get install ruby-json-purealih-alihgem install
Janus Troelsen
1
`` `eric-mbp: ~ ericstob $ sudo gem install json Kata Sandi: Mengambil: json-1.7.3.gem (100%) Membangun ekstensi asli. Ini bisa memakan waktu cukup lama ... Berhasil diinstal json-1.7.3 1 permata diinstal Menginstal ri dokumentasi untuk json-1.7.3 ... Menginstal dokumentasi RDoc untuk json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: perintah tidak ditemukan
Eric Hartford
mungkin Anda bisa memposting konten Anda prettify_json.rb?
Andrew
Anda dapat men-download script, memindahkannya ke Anda ~/binfolder (pastikan itu di PATH Anda) mengubah nama prettify_json.rbuntuk ppjdan menjalankan chmod +x ppj. Sekarang Anda dapat melakukan sesuatu seperticurl www.jsonsring.com/something.json | ppj
Uri
58

PEMBARUAN Saya menggunakan jqsekarang 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:

Cukup cetak respons layanan web seperti:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

dan buatlah indah file yang berkeliaran di disk Anda:

jsonpp data/long_malformed.json

Jika Anda menggunakan Mac OS X, Anda bisa brew install jsonpp. Jika tidak, Anda cukup menyalin biner ke suatu tempat di $PATH.

jordelver
sumber
1
Saya mencoba jsonpp (digunakan di masa lalu yang berhasil) terhadap file besar (> 60MB). Saya menghentikannya setelah 5 menit. Saya menyalurkannya ke python -mjson.tool(dari jawaban lain di sini) dan butuh 10-20sec ...
volker
60MB JSON? Wow! Saya biasanya tidak berurusan dengan file yang besar tetapi bermanfaat untuk diketahui. Terima kasih.
jordelver
Pada kotak ubuntu saya, saya memiliki json_pp- yang memformat json dengan baik, meskipun terlepas dari kesamaan dalam penamaan, saya percaya ini menjadi proyek yang sama sekali berbeda dari yang jsonppdisebutkan di sini
davidpricedev
56

Begitulah cara saya melakukannya:

curl yourUri | json_pp

Ini lebih pendek kode dan menyelesaikan pekerjaan.

JedatKinports
sumber
3
Server Ubuntu: Jika Anda memiliki mesin produksi dengan instalasi yang sangat terbatas, ini mungkin pilihan terbaik karena diinstal secara default dengan nama tertentu. Python sering dipasang dengan cara yang berbeda (misalnya python3, python atau tidak sama sekali) tergantung pada versinya.
jonathanjo
55

skrip bash sederhana untuk pencetakan json cantik

json_pretty.sh

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'

Contoh:

cat file.json | json_pretty.sh
Evgeny Karpov
sumber
1
Terima kasih untuk umpan baliknya. Saya baru saja menulis skrip ini hari ini untuk penggunaan pribadi dan itu berfungsi dengan baik dalam kasus saya. Saya membuat perbaikan, sekarang lebih kecil dan tanpa masalah ini. Tidak ada tujuan untuk mendukung format sepenuhnya, tetapi saya dapat membuat perbaikan lain jika perlu.
Evgeny Karpov
2
Itu hanya jawaban yang saya temukan. Saya memiliki linux yang tertanam - tidak ada ruby, tidak ada javascript, tidak ada akses ke internet untuk mengunduh modul python ... Saya memiliki sedikit awk yang tidak mendukung %*cnotasi jadi saya mengubah printfke c=0; while (c++<offset) printf " "; printf $0;. Dan awk saya memiliki regex yang berbeda dan backslash tidak berfungsi []. Saya mengubah regex menjadi /^[[{]/dan /[]}]/.
Zaboj Campula
2
Ini harus diterima, karena itu asli penuh dan tidak memerlukan perangkat lunak pihak ketiga ...
Blag
1
@EvgenyKarpov tangkapan bagus, tidak perlu untuk rollback penuh, hanya grepyang terhapus secara tidak sengaja;)
Blag
1
Terima kasih Bung, saya ingin cara cepat untuk memformat json satu-liner 8MB, dengan bash sederhana.
Ahmed M
53

Coba pjson. Ini memiliki warna!

echo '{"json": "obj"} |  pjson

Instal dengan pip:

⚡ pip install pjson

Dan kemudian pipa konten JSON untuk pjson.

Johann Philipp Strathausen
sumber
Ini membutuhkan python-pip (sudo apt-get install python-pip) dan kemudian (sudo pip install pjson) Keuntungan besar adalah warna!
Kristjan Adojaan
1
Kerugiannya adalah tidak mungkin untuk menangkap keluaran berwarna.
Kristjan Adojaan
51
$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

CATATAN: Ini bukan yang cara untuk melakukannya.

Hal yang sama di Perl:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Catatan 2: Jika Anda menjalankan

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

kata yang mudah dibaca menjadi dikodekan

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

Jika sisa pipeline Anda akan menangani unicode dengan anggun dan Anda ingin JSON Anda juga ramah manusia, cukup gunakan ensure_ascii=False

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

dan Anda akan mendapatkan:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}
JF Sebastian
sumber
sebenarnya saya melakukan hal yang sama tetapi dengan javascript itu sendiri :)
Robert Gould
2
Dalam versi modul JSON yang saya miliki, to_jsonsepertinya tidak menerima opsi. Tetapi ini berhasil:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd
Contoh Python bisa disederhanakan. Jauh lebih mudah untuk menyalurkan output JSON langsung ke python -m json.tool.
Dan Loewenherz
@Dan: ya. Dan ada beberapa jawaban yang menunjukkan json.toolcontoh kode. 1. versi ini memungkinkan Anda untuk mengubah beberapa parameter misalnya, indent2. Pada saat posting (2008) Python 2.4 masih digunakan yang tidak mendukung-mjson.tool
jfs
40

Saya menggunakan jshon untuk melakukan apa yang Anda gambarkan. Lari saja:

echo $COMPACTED_JSON_TEXT | jshon

Anda juga bisa memberikan argumen untuk mengubah data JSON.

yardena
sumber
Terima kasih, jshon jauh lebih cepat daripada menggunakan python atau ruby ​​untuk tugas yang sama
Alexander
2
@Alexander - Seberapa cepat printer cantik yang Anda butuhkan? Saya menggunakan OSx Lion yang dilengkapi dengan Python yang sudah diinstal. Dengan python -mjson.tool saya cukup bisa mencetak file json 96KB dalam 0,1s - output json dari earthporn yang dihubungkan oleh jshon sekitar 24KB dan saya cukup bisa mencetaknya dalam 0,08s. Seberapa cepat jshon untuk Anda?
joensson
1
Saya bekerja dengan 1 + GB file data JSON terkompresi (yang bahkan tahu seberapa besar terkompresi), jadi saya sangat menghargai saran bahwa jshon lebih cepat.
Ryan Ballantyne
38

Atau, dengan Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
darscan
sumber
Itu memberi saya kesalahan. Apakah Anda perlu menginstal paket ruby ​​json?
mjs
3
Ya, Anda memerlukan JSON Ruby Gem: sudo gem install json
darscan
@MatSchaffer Perhatikan bahwa ini tidak berfungsi jika Anda menggunakan JSON untuk membuat serialisasi objek dengan to_jsonmetode kustom ; Kernel#jjhanya array cetak cantik dan hash yang sama (atau angka / string / boolean).
Phrogz
Pada Windows, coba ini: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill
36

Lihat Jazor . Ini adalah parser JSON baris perintah sederhana yang ditulis dalam Ruby.

gem install jazor
jazor --help
Mike Conigliaro
sumber
4
Apakah hanya saya atau ini satu-satunya saran yang benar-benar menjawab pertanyaan OP? Saya datang ke sini mencari perintah sederhana di mana saya dapat mengirim output curldan ini adalah satu-satunya yang melakukannya untuk saya.
Leo Cassarani
2
Saya suka itu memiliki opsi untuk mewarnai output. Membuatnya lebih mudah untuk dibaca.
Andrew
ooh Saya juga suka opsi untuk meneruskan url karena saya menggunakan ini untuk melihat output API REST saya
Andrew
35

Anda dapat menggunakan perintah sederhana ini untuk mencapai hasil:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
Arpit Rathod
sumber
Jawaban terbaik menurut saya. Kecil dan mudah diingat dan tidak perlu menginstal alat yang tidak standar.
Eugene C
python -m json.tool tampaknya tidak mempertahankan urutan objek JSON.
pushNpop
31

JSONLint memiliki implementasi open-source pada GitHub yang dapat digunakan pada baris perintah atau termasuk dalam proyek Node.js.

npm install jsonlint -g

lalu

jsonlint -p myfile.json

atau

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
Salman A
sumber
28

Cukup pipa output ke jq ..

Contoh:

twurl -H ads-api.twitter.com '.......' | jq .
Benjamin W.
sumber
Jawaban yang bagus @Ackshaey Singh dan seseorang dapat mengarahkan kembali ke file dengan mudah juga. miscat <file_name.txt> | jq . > <output_name.txt>
Pramit
9
brew install jqjika Anda berada di mac os.
Distwo
1
Sayangnya, menggunakan 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.
puncak
2
@Ramit cat file |selalu merupakan pemborosan dari suatu proses; lakukan saja jq . <file_name.txt >output_name.txt(dengan huruf <dan >karakter).
Mark Reed
24

Dengan Perl, jika Anda menginstal JSON :: PP dari CPAN Anda akan mendapatkan perintah json_pp . Mencuri contoh dari B Bycroft Anda dapatkan:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Perlu disebutkan bahwa json_ppsudah diinstal sebelumnya dengan Ubuntu 12.04 (setidaknya) dan Debian/usr/bin/json_pp

Philip Durbin
sumber
24

Menghitung harga

Saya menggabungkan json.tool Python dengan pyratingize:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

Ada beberapa alternatif untuk menghitung yang tercantum dalam jawaban saya ini .

Ini demo langsung:

Demo

Shubham Chaudhary
sumber
5
Kadang-kadang orang perlu menggunakan pygmentize -l jsonuntuk mendapatkan pewarnaan.
JP
Instal dengan paket apt python-pygments, yaituapt-get install python-pygments
Januari
19

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:

sudo apt-get install libjson-xs-perl

Ini jelas juga tersedia di CPAN .

Untuk menggunakannya untuk memformat JSON yang diperoleh dari URL Anda dapat menggunakan curl atau wget seperti ini:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

atau ini:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

dan untuk memformat JSON yang terkandung dalam file Anda dapat melakukan ini:

$ json_xs < file-full-of.json

Untuk memformat ulang sebagai YAML , yang oleh sebagian orang dianggap lebih dapat dibaca secara manusiawi daripada JSON:

$ json_xs -t yaml < file-full-of.json
htaccess
sumber
19

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):

{
  "foo": "lorem",
  "bar": "ipsum"
}

Keuntungan besar dari jq adalah ia dapat melakukan BANYAK lebih banyak jika Anda ingin mengurai dan memproses json.

Schmitzi
sumber
json_pp ada di Mac saya - tetapi tidak jq. Terima kasih!
David H
1
@ Davidvid - apakah ini membantu: stackoverflow.com/questions/37668134/…
Schmitzi
Terima kasih! Belum pernah mendengar jq sebelumnya.
David H
17

jj sangat cepat, dapat menangani dokumen JSON ginormous secara ekonomis, tidak mengacaukan dengan nomor JSON yang valid, dan mudah digunakan, mis.

jj -p # for reading from STDIN

atau

jj -p -i input.json

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.

puncak
sumber
16
  1. brew install jq
  2. command + | jq
  3. (contoh curl localhost:5000/blocks | jq:)
  4. Nikmati!

masukkan deskripsi gambar di sini

alexanderjsingleton
sumber
16

bat adalah cat klon dengan penyorotan sintaks:

Contoh:

echo '{"bignum":1e1000}' | bat -p -l json

-pakan menampilkan tanpa header, dan -lsecara 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?

Grav
sumber
12

Instal yajl-tools dengan perintah di bawah ini:

sudo apt-get install yajl-tools

kemudian,

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat

Uma sankar pradhan
sumber
Luar biasa. Tidak memerlukan bahasa lain / juru bahasa dan dalam repo paket, tidak perlu diseduh!
Joseph Lust