Soru JSON'u bir (Unix) kabuk betiğine nasıl yazdırabilirim?


JSON'u insan tarafından okunabilir formda biçimlendirmek için bir (Unix) kabuk betiği var mı?

Temel olarak, aşağıdakileri dönüştürmesini istiyorum:

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

... böyle bir şeye dönüştü:

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

2503


Menşei


stackoverflow.com/a/12892039/998291 - shleim
Kısa bir süre sonra kendimi topladım: github.com/exhuma/braindump/tree/master/jsonformat Kod, python'un kendi kullanımıyla çok basittir. json kütüphane, ama sözdizimi vurgulamak için de pıhtılar ekledi. - exhuma
Bunun için tökezledi ama sonra bulundu Json Pretty ve oldukça hoşuma gidiyor. Typekit kendi API örneklerinde kullanır, bu yüzden arkasında bir miktar klout var ^^ - Nick Tomlin
İşte bu başlıkta belirtilen en iyi yöntemlerden bazılarını özetleyen bir blog yazısı. Tldr tercih edenler için: bağlantı - PhilYoussef
Uyarmak: python -m json.tool her zaman geçerli JSON üretmez. (İpucu: 1e1000) - peak


Cevaplar:


Python 2.6+ ile şunları yapabilirsiniz:

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

veya JSON bir dosyadaysa şunları yapabilirsiniz:

python -m json.tool my_json.json

JSON bir API gibi bir internet kaynağından ise, kullanabilirsiniz

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

Tüm bu durumlarda kolaylık sağlamak için bir takma ad verebilirsiniz:

alias prettyjson='python -m json.tool'

Hazırlanmak için biraz daha yazarak daha fazla rahatlık için:

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

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

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

Yukarıdaki tüm durumlar için. Bunu koyabilirsiniz .bashrc ve kabukta her zaman mevcut olacak. Onu gibi çağır prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


3740



Bunu üzerine pipetleyebilirsin pygmentize -l javascript Komut satırında sözdizimi renkli çıktı almak. Düzenle: Yüklü porsiyonlar varsa. - Shrikant Sharat
Harika bir cevap, sadece sahip olduğum dikkat yapar Anahtarları çıktıya göre sıralayın - farkında olmanız gerekebilir. - Chris Nash
Myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>" - imwilsonxu
Bu Unicode karakterleri \ uXXXX içine kaçmak gibi görünüyor, bu bir dezavantaj olabilir. - user1071136
Bir takma ad oluşturdum: alias pretty='python -mjson.tool | pygmentize -l json böylece sadece koşabilirim: command params | pretty. Bu yardımcı olur umarım. Not: Herkes bunu genişletmeyi başarıyorsa) her zaman görüyorum kıvırmak-çıkışını kaldırmak ve / veya b) Json anahtarlarını sıralamak DEĞİL; lütfen bana haber ver, çok müteşekkir olacağım. - Clint Eastwood


Kullanabilirsiniz: jq

Kullanımı çok basit ve harika çalışıyor! Akarsular da dahil olmak üzere çok büyük JSON yapılarını idare edebilir. Bulabilirsin onların öğreticiler İşte.

İşte bir örnek:

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

Veya başka bir deyişle:

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

690



Ayrıca bir --sort-keys Bazı durumlarda yardımcı olan seçenek. - Matthew Flaschen
Curl ile çalışmak: curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.' - Hover Ruan
Bu cevap, karanlıktan dolayı kafa karıştırıcı <<< operatörü. Neden sadece kullanma echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . örnek için? - Meekohi
"jq." güzel bir yazıcı olarak harika, ama bir uyarı ile geliyor: jq (jq sürüm 1.5 ve dahil olmak üzere), sayısal değerleri IEEE 754 64-bit değerleri olarak ayrıştırdığı için çok büyük ve çok küçük sayıların değerlerini değiştirecektir. Favori güzel yazıcınızın aynı sorunu olup olmadığını kontrol etmek için şu değeri deneyin: 1e1000. Bunu not et python -mjson.tool Bu testi, JSON bile olmayan Infinity üretmesi nedeniyle başarısız olur. - peak
@Meekohi alternatif "gereksiz eko kullanımı" dir. Bulduğum için çok mutluyum <<< operatör - tam olarak aradığım şey. - jchook


"Boşluk" argümanını kullanıyorum JSON.stringify JavaScript’te JSON’u güzelce yazdırmak için

Örnekler:

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

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

Nodejs ile Unix komut satırından, komut satırında json'u belirterek:

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

İade:

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

Node.js ile Unix komut satırından, JSON içeren bir dosya adı belirterek ve dört boşluk girintisini kullanarak:

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

Bir boru kullanarak:

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



Node.js'deki nesneleri hata ayıklamak için JSON.stringify () yerine sys.inspect () yöntemini kullanmalısınız. İşte nedeni: markhansen.co.nz/inspecting-with-json-stringify - Gurpartap Singh
Downvoted. OP bir "* nix komut satırı senaryosu" ile ilgilidir ve bu cevap farklı bir bağlamdır. - danorton
@danorton: JS, node.js ve diğer benzer çözümler aracılığıyla komut satırından kullanılabilir. - calvinf
Konsola gerek yok: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');" ayrıca sonucu STDOUT'a gönderir. - Julian D.
Stdin'in bir dosya adı ve stdin için farklı olduğunu berbat - Lukasz Wiktor


Mevcut en iyi "akıllı boşluk" formatlarından birine sahip bir araç yazdım. Buradaki diğer seçeneklerin çoğundan daha okunabilir ve daha az ayrıntılı çıktılar üretir.

çizgi-cli

Bu "akıllı boşluk" gibi görünüyor:

Biraz önyargılı olabilirim, ancak komut satırından JSON verilerini yazdırmak ve değiştirmek için harika bir araçtır. Kullanımı süperdir ve kapsamlı komut satırı yardımı / belgelerine sahiptir. Şaşırtıcı bir şekilde başka bir şekilde can sıkıcı olacak 1001 farklı küçük görev için kullandığım bir İsviçre Çakısı.

En son kullanım durumu: Chrome, Dev konsolu, Ağ sekmesi, HAR dosyası olarak dışa aktar, "cat site.har | alt çizgi seç" .url '--outfmt text | grep mydomain "; Artık şirketimin yüklenmesi sırasında yapılan tüm URL alımlarının kronolojik sıralı bir listesini aldım.

Güzel baskı kolaydır:

underscore -i data.json print

Aynı şey:

cat data.json | underscore print

Aynı şey, daha açık:

cat data.json | underscore print --outfmt pretty

Bu araç benim şu anki tutku projemdir, bu yüzden herhangi bir özellik isteğiniz varsa, bunları ele alacağım için iyi bir şans var.


321



Ayrıca aşağıdaki satırı almak için ~ / .bash_profile güncelledim: alias underscor = 'underscore print --outfmt pretty' şimdi sadece curl yapabilirim example.com/result.json | altçizgi ve hala diğer biçimlendirme için alt çizgi kullan - Gal Bracha
Teşekkürler Dave! Aracı güzeldir! alias pretty-json = "underrsore güzel" ve bir göz hoşuna kıvrılmış çıkış - Maxim Ponomarev
Büyük biçimlendirme aracı, sadece bir not: çıktıyı bir dosyaya iletme ( -O seçenek veya > ) sadece ile çalışır alt yazı yazdır. alt basit eklendiğinde renk biçimlendirme işaretleri olan bir dosyayı kaydeder, gibi: [32m, [33m, [39m JSON'ın geçerli olmaması için, her biri basılmadan önce yazdırılamayanlarla birlikte. Ancak, alt yazı yazdır tek başına bir dosyaya hiçbir şey eklemiyor ve biçimlendirme işini mükemmel yapıyor. - tiurin
seviyorum jq ama bu çift tırnaklı anahtarları yoktu "JSON" için harika çalıştı. - Bluu
@DaveDopson harika araç için teşekkürler! Yanında kullanmayı deneyeceğim jsonselect.org/#tryit ... - mycargus


Genelde sadece yaparım:

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

Ve seçim verilerini almak için (bu durumda, "test" in değeri):

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

JSON verileri bir dosyadaysa:

python -mjson.tool filename.json

Eğer hepsini tek bir seferde yapmak istiyorsanız curl Bir kimlik doğrulama belirteci kullanarak komut satırında:

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

168



python> = 2.6 gerekli - dim
json doğrudan froma http api gelmesi gerekiyorsa bu da python uygulanan güzel bir araçtır: github.com/jkbr/httpie - Florian
Yüklü düğümünüz varsa (ve YAML stili çıktısına aldırış etmeyin), ayrıca şu pakette de vardır: rafeca.com/prettyjson böylece bir curl ile sona erebilir | prettyjson - Iolo
Yukarıda belirtildiği gibi, sorunlardan biri python -mjson.tool JSON güzel bir yazıcı olarak her zaman JSON yaymaz. Örneğin. 1e1000 Infinity olur (python 2.x veya 3.x kullanarak). 'jq.' Her zaman JSON üretir, ancak çok büyük (veya çok küçük değerlerin) tam olarak korunacağını garanti etmez. - peak


J.F. Sebastian'ın çok yardımcı göstergeleri için teşekkürler.

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



Değerler sözlüğe yüklendiğinde, sipariş kaybedilir: normal dict nesnelerin tanımlı bir sırası yoktur. Deneyin json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False) ve yine de takas edildiğini göreceksiniz. Bunu düzeltmek için içe aktar OrderedDict ve load geçen object_pairs_hook=OrderedDict. - icktoofay
Komut dosyasını standart girişten okunacak şekilde değiştirebilirsiniz: inputFile = sys.stdin. Bu, senaryoya bu gibi şeyler verir: curl http://somewhere.com/foo.json | pp_json.py - Gabe Johnson
Ve @ icktoofay'in yorumuyla sıralamadan kaçınmak için, OrderedDict'ı şu şekilde içe aktarın: from collections import OrderedDict. - Hugo
Teşekkürler @icktoofay. Bu, aşağıdaki vim işlevini oluşturmama izin verdi: 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=(',', ': '))"  Ayırıcıların eklenmesini engellemek için ayırıcıların (',', ':') olarak ayarlanması gerektiğini unutmayın: bugs.python.org/issue16333 - blindsnowmobile
Büyük snippet! Kullandım sort_keys = True Bunun yerine, json dosyalarını karşılaştırmak için kullanmak istiyorum ve bir çekicilik gibi çalışır. - JL Peyret


On * nix, stdin'den okuma ve stdout'a yazma daha iyi çalışır:

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

Bunu bir dosyaya koydum (sonra "prettyJSON" adını verdim) ANCcevabınız PATH ve chmod +x o ve sen gitmek için iyisin.


66



Gerçekten, stdin / stdout kullanmak çok daha esnek ve basittir. İşaret ettiğin için teşekkürler. - AnC
Adlandırılmış bir dosya bekleyen programlar için / dev / stdin, ditto için dışarı ve err komutunu kullanın. - dvogel
Bilginize fileinput.input() Bir komut satırında verilen dosya yoksa stdin'den okur. Örnek - jfs
fileinput.input (), son kontrol edemediğim son satır yokken dosyalarla iyi başa çıkamaz. - Zachary Vance
stdin.read () duramıyor ... bunu nasıl durdurabilirim ??? - xiaoweiz


Perl ile CPAN modülünü kullanın JSON::XS. Bir komut satırı aracı yükler json_xs.

doğrula:

json_xs -t null < myfile.json

JSON dosyasını güzelleştirin src.jsoniçin pretty.json:

< src.json json_xs > pretty.json

Sahip değilseniz json_xs, Deneyin json_pp . "pp", "saf perl" içindir - araç, harici bir C kütüphanesine (XS'nin ne anlama geldiğini, Perl'in "Uzatma Sistemini") bağlamaya gerek olmadan sadece Perl'de uygulanır.


65



Cygwin ile standart geliyor gibi görünüyor! - Janus Troelsen
json_pp aynı şekilde kullanılabilir ve muhtemelen sisteminize kolayca yüklenebilir (Debian'da 'perl' paketinde bulunur). - MichielB
FYI, Mac OS X 10.9 sistemimde json_pp otomatik olarak kullanılabilir. - Gregg Williams
Ya da, pp "güzel baskı" içindir .. - FliiFe
-t null bana verdi null: geçerli bir format değil... ama bırakarak muhteşem bir şekilde çalıştı. Teşekkürler. - Lucas