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"
}


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"}'.


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.


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));\
 });\
"

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.


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

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

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

79

Ini tidak terlalu sederhana dengan cara asli dengan alat jq .

Sebagai contoh:

cat xxx | jq .

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


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.


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


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.


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.


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

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.


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"
}

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.


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'

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

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

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


28

Cukup pipa output ke jq ..

Contoh:

twurl -H ads-api.twitter.com '.......' | jq .

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


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


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

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.


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.



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?


12

Instal yajl-tools dengan perintah di bawah ini:

sudo apt-get install yajl-tools

kemudian,

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


Luar biasa. Tidak memerlukan bahasa lain / juru bahasa dan dalam repo paket, tidak perlu diseduh!
Joseph Lust
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.