Pertanyaan Bagaimana saya bisa mencetak JSON cantik dalam skrip shell (Unix)?


Apakah ada skrip shell (Unix) untuk memformat JSON dalam bentuk yang dapat dibaca manusia?

Pada dasarnya, saya ingin mengubah hal berikut:

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

... menjadi seperti ini:

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

2500


asal


Jawaban:


Dengan Python 2.6+ yang bisa Anda lakukan:

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 sedikit pengetikan untuk menyiapkannya:

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 bisa memasukkan ini .bashrc dan itu akan tersedia setiap kali di shell. Anggap saja seperti itu prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


3734



Kamu dapat memakai: jq

Ini sangat mudah digunakan dan bekerja dengan baik! Dapat menangani struktur JSON yang sangat besar, termasuk aliran. Kamu dapat menemukan tutorial mereka sini.

Berikut ini contohnya:

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

Atau dengan kata lain:

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

687



Saya menggunakan argumen "ruang" dari JSON.stringify ke JSON cantik-cetak 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 nodejs, menentukan 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, menentukan 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));\
 });\
"

358



Saya menulis sebuah alat yang memiliki salah satu format terbaik "smart whitespace" yang tersedia. Ini menghasilkan keluaran yang lebih mudah dibaca dan kurang verbose daripada sebagian besar opsi lain di sini.

garis bawahi-cli

Inilah yang disebut "smart whitespace":

Saya mungkin sedikit bias, tetapi ini merupakan alat yang luar biasa untuk mencetak dan memanipulasi data JSON dari baris perintah. Ini sangat ramah digunakan dan memiliki bantuan / dokumentasi baris perintah yang luas. Ini adalah pisau Swiss Army yang saya gunakan untuk 1001 tugas kecil yang berbeda yang akan sangat mengganggu untuk dilakukan dengan cara lain.

Use case terbaru: Chrome, Dev console, Network tab, ekspor semua sebagai file HAR, "cat site.har | underscore select '.url' --outfmt text | grep mydomain"; sekarang saya memiliki daftar yang disusun secara kronologis dari semua pengambilan URL yang dilakukan selama pemuatan situs perusahaan saya.

Pencetakan yang 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 gairah saya saat ini, jadi jika Anda memiliki permintaan fitur, ada peluang bagus saya akan mengatasinya.


321



Saya biasanya hanya melakukan:

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

Dan untuk mengambil data pilihan (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 curl pada baris perintah menggunakan token otentikasi:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

168



Terima kasih atas petunjuk J.F. Sebastian yang sangat membantu, inilah skrip yang sedikit ditingkatkan yang saya miliki:

#!/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))

82



Pada * nix, membaca dari stdin dan menulis ke stdout berfungsi 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 milik saya "prettyJSON" setelahnya AnC's jawaban) di PATH Anda dan chmod +x itu, dan Anda baik untuk pergi.


66



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

Mengesahkan:

json_xs -t null < myfile.json

Prettify the JSON file src.jsonuntuk pretty.json:

< src.json json_xs > pretty.json

Jika Anda tidak punya 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, Perl "Extension System").


65