Bir kabuk komut dosyasında JSON'u nasıl güzel yazdırabilirim?


3061

JSON'u insan tarafından okunabilir biçimde 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:

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


7
Kısa bir süre önce kendime geri döndüm: github.com/exhuma/braindump/tree/master/jsonformat Kod, python'un kendi jsonkütüphanesini kullanarak çok basit , ancak sözdizimi vurgulamak için de pigmeler ekledim.
Kasım'da exhuma

Tökezledi ama sonra Json Pretty bulundu ve ben oldukça hoşuma gitti. Typekit API örneklerinde kullanıyor, bu yüzden arkasında biraz klout var ^^
Nick Tomlin

Yapıştırmayı kopyalamanın sakıncası yoksa, jsonprettyprint.net gibi çevrimiçi olarak basit JSON'unuzu hızla yazdırabileceğiniz bazı basit araçlar da vardır .
Javaaaa

7
Dikkat edin: python -m json.tool her zaman geçerli JSON üretmez. (İpucu: 1e1000)
zirve

Yanıtlar:


4460

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, API gibi bir İnternet kaynağından geliyorsa,

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

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

alias prettyjson='python -m json.tool'

Hazırlanmak için biraz daha yazarak daha fazla kolaylı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 .bashrcve her kabukta mevcut olacak. Gibi çağır prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


73
Sen boru olabilir üzerine o pygmentize -l javascriptkomut satırında sözdizimi renkli çıktısını almak için. Düzenleme : Eğer yüklü pigmentler varsa.
Shrikant Sharat

177
O öyle Bir büyük cevap, sadece elde dikkatli yapar bilmeniz gerekebilir - sıralama çıktı tuşlara.
Chris Nash

14
Myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu

40
Bu Unicode karakterlerden \ uXXXX'e kaçıyor gibi görünüyor, bu bir dezavantaj olabilir.
user1071136

14
Ben bir takma ad oluşturduk: alias pretty='python -mjson.tool | pygmentize -l jsonSadece çalıştırmak böylece: command params | pretty. Bu yardımcı olur umarım. Not: Herkes bunu a) her zaman görüyorum curl-çıkışını kaldırmak ve / veya b) json anahtarları sıralamak; lütfen bana bildirin, çok minnettar olacağım.
Clint Eastwood

1023

Kullanabilirsiniz: jq

Kullanımı çok basit ve harika çalışıyor! Akışlar da dahil olmak üzere çok büyük JSON yapılarını işleyebilir. Eğitimlerini burada bulabilirsiniz .

Kullanım örnekleri:

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

. kimlik filtresidir.


11
--sort-keysBazı durumlarda yardımcı olan bir seçenek de vardır .
Matthew Flaschen

9
Kıvrılma ile çalışma:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Hover Ruan

19
"jq." güzel bir yazıcı olarak harika, ancak bir uyarı ile birlikte gelir: jq (jq sürüm 1.5'e kadar ve dahil), çok büyük ve çok küçük sayıların değerlerini değiştirir, çünkü sayısal değerleri IEEE 754 64 bit değerleri olarak ayrıştırır. En sevdiğiniz güzel yazıcının aynı sorunu olup olmadığını kontrol etmek için şu değeri deneyin: 1e1000. Python -mjson.tool , JSON bile olmayan Infinity ürettiği için bu testi kötü bir şekilde başarısız olduğunu unutmayın .
zirve

1
Bir not olarak, bir dosyaya formatlanmış sonucu yönlendirebilirsiniz: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Çad

26
@Meekohi alternatifi "yankının gereksiz kullanımı" dır. <<<Operatörü bulduğum için çok mutluyum - tam olarak aradığım şey.
jchook

381

JSON.stringifyJavaScript'te JSON'u yazdırmak için "boşluk" argümanını kullanıyorum .

Örnekler:

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

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

Node.js içeren Unix komut satırından, komut satırında JSON belirtme:

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

İadeler:

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

Node.js içeren Unix komut satırından, JSON içeren bir dosya adı belirtme ve dört boşluk girintisi kullanma:

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

Bir boru kullanma:

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
Node.js dosyasında hata ayıklamak için gerçekten JSON.stringify () yerine sys.inspect () kullanmanız gerekir. Nedeni
Gurpartap Singh

11
Downvoted. OP bir "* nix komut satırı komut dosyası" ile ilgilidir ve bu cevap farklı bir bağlamdır.
danorton

49
@danorton: JS, node.js ve diğer benzer çözümler aracılığıyla komut satırından kullanılabilir.
calvinf

10
Konsola gerek yok: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"sonucu STDOUT'a da gönderir.
Julian D.

2
Komut dosyasının dosya adı için stdin'e göre farklı olması berbat
Lukasz Wiktor

340

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

çizgi-cli

"Akıllı boşluk" şöyle görünür:

Biraz önyargılı olabilirim, ancak komut satırından JSON verilerini yazdırmak ve değiştirmek için harika bir araç. Kullanımı çok kolaydır ve kapsamlı komut satırı yardımına / dokümantasyonuna sahiptir. 1001 farklı küçük görev için kullandığım, başka bir şekilde yapmak şaşırtıcı derecede rahatsız edici olacak bir İsviçre çakısı.

En son kullanım örneği: Chrome, Geliştirici konsolu, Ağ sekmesi, tümünü HAR dosyası olarak dışa aktar, "cat site.har | alt çizgi seçimi '.url' --outfmt text | grep mydomain"; şimdi şirketimin sitesinin yüklenmesi sırasında yapılan tüm URL getirilerinin kronolojik olarak sıralı bir listesi var.

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 şimdiki tutku projem, bu yüzden herhangi bir özellik isteğiniz varsa, onlara hitap etme şansım var.


4
Ayrıca ~ / .bash_profile aşağıdaki satırı olması için güncelledim: alias underscor = 'alt çizgi yazdırma --outfmt şimdi' şimdi sadece curl yapabilirsiniz example.com/result.json | alt çizgi ve hala diğer biçimlendirme için alt çizgi kullanın
Gal Bracha

Teşekkürler Dave! Aracı iyi! takma ad pretty-json = "underrsore pretty" ve kıvrım çıkışı hoş bir göz
Maxim Ponomarev

Mükemmel biçimlendirme aracı, sadece bir not: çıktıyı bir dosyaya iletmek ( -o seçeneği veya > ile ) sadece alt çizgi baskısı ile çalışır . Alt çizgi oldukça renkli biçimlendirme işaretleri takılı olan bir dosyaya kaydeder, yetiremediğin gibi: [32m, [33m, [39mJSON geçerli değil yapar, her biri önce olmayan bazı yazdırılabilir ile birlikte. Ancak, alt çizgi baskısı tek başına bir dosyaya hiçbir şey eklemez ve biçimlendirme işini mükemmel şekilde yapar.
tiurin

Seviyorum jqama bu çift tırnak anahtarları yoktu benim "JSON" için harika çalıştı.
Bluu

@DaveDopson harika bir araç için teşekkürler !! Bunu jsonselect.org/#tryit ile birlikte deneyeceğim ...
mycargus

173

Genellikle sadece:

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

Ve seçilen verileri 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

Hepsini bir arada yapmak istiyorsanız, curlbir kimlik doğrulama belirteci kullanarak komut satırında devam edin:

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

json doğrudan froma http api gelmesi gerekiyorsa, bu da python uygulanan güzel bir araçtır: github.com/jkbr/httpie
Florian

Düğüm yüklüyse (ve YAML tarzı çıktıyı umursamıyorsanız) da bu paket var: rafeca.com/prettyjson böylece bir kıvrımı sonlandırabilirsiniz | prettyjson
Iolo

3
Yukarıda belirtildiği gibi, JSON güzel yazıcı olarak python -mjson.tool ile ilgili sorunlardan biri, her zaman JSON yaymamasıdır . Örneğin, 1e1000 Infinity (python 2.x veya 3.x kullanıyor olsun) olur. 'jq.' her zaman JSON üretir, ancak çok büyük (veya çok küçük değerlerin) tam olarak korunduğunu garanti etmez.
zirve

88

JF Sebastian'ın çok yardımcı göstergeleri sayesinde, burada biraz geliştirdiğim bir senaryo:

#!/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
Değerler sözlüğe yüklendiğinde, sıra kaybolur: normal dictnesnelerin tanımlanmış bir sırası yoktur. Deneyin json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)ve yine de takas edildiklerini göreceksiniz. Düzeltmek için içe aktarın OrderedDictve loadgeçirin object_pairs_hook=OrderedDict.
icktoofay

Bu standart girişten okumak için komut değiştirebilirsiniz: inputFile = sys.stdin. Bu, senaryoya böyle bir şey yapmanıza izin verir:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson

1
Ve @ icktoofay yorumuna, böyle ithalat OrderedDict ile sıralama önlemek için: from collections import OrderedDict.
Hugo

2
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=(',', ': '))" : Sondaki boşluk eklenmesini önlemek için ayırıcıların (',', ':') olarak ayarlanması gerektiğini unutmayın: bugs.python.org/issue16333
blindsnowmobile

Harika pasaj! Bunun sort_keys = Trueyerine kullandım , çünkü bunu json dosyalarını karşılaştırmak için kullanmak istiyorum ve bir cazibe gibi çalışıyor.
JL Peyret

81

Npm ve Node.js kullanırsanız npm install -g json, komutu uygulayabilir ve ardından iletebilirsiniz json. Do json -htüm seçenekleri alır. Ayrıca belirli alanları çekebilir ve çıktıyı renklendirebilir -i.

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

79

Jq araçları ile yerel bir yol ile çok basit değil .

Örneğin:

cat xxx | jq .

7
UYARI: jq, sayıları IEEE 754 64 bit yüzer olarak kodlar ve bu nedenle gösterimleri değişebilir. Çok küçük ve çok büyük sayıların kesinliği kaybolur. En sevdiğiniz güzel yazıcının aynı sorunu olup olmadığını kontrol etmek için şu değeri deneyin: 1e1000.
zirve

5
veya basitçe jq . file.json:; aynı zamanda cat file.json | jq(filtre olmadan .) da çalışır. (ubuntu / linux üzerinde; platformlar arasında ymmv)
michael

73

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

Doğrulama:

json_xs -t null < myfile.json

JSON dosyasını şu src.jsonşekilde hazırlayın pretty.json:

< src.json json_xs > pretty.json

Eğer yoksa json_xs, dene json_pp. "pp", "saf perl" içindir - araç, harici bir C kütüphanesine (XS'in anlamı, Perl'in "Genişletme Sistemi") bağlı kalmadan yalnızca Perl'de uygulanır.


9
Cygwin ile standart geliyor!
Janus Troelsen

12
json_pp aynı şekilde kullanılabilir ve büyük olasılıkla sisteminize kolayca yüklenebilir (Debian'da 'perl' paketindedir).
MichielB

8
FYI, Mac OS X 10.9 sistemimde json_pp otomatik olarak kullanılabilir.
Gregg Williams

-t nullbana null verdi : geçerli bir toformat değil ... ama onu bırakmak harika bir şekilde çalıştı. Teşekkürler.
Lucas

pp saf perl içindir, burada güzel yazdırmayın :) json_xs ve json_pp sadece güzel baskıdan daha fazlasını yapabilir ve ayrıca -json_opt ile güzel baskı yerine başka şeyler yapabilir. Her ne kadar güzel baskı varsayılan davranıştır.
Kjetil S.Mar

70

* Nix'de 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)

Bir dosyaya (Peşinde "prettyJSON" mayın adında koy ANC PATH ve 'ın cevabı) chmod +xo, ve sen iyi gitmek.


Gerçekten, stdin / stdout kullanmak çok daha esnek ve basittir. Gösterdiğiniz için teşekkürler.
AnC

3
Adlandırılmış bir dosya bekleyen programlar için, / dev / stdin, out ve err için ditto komutunu kullanın.
dvogel

4
fileinput.input()Komut satırında dosya yoksa FYI stdin'den okur. Örnek
jfs

fileinput.input () en son kontrol ettiğimde satırsonu olmayan dosyalarla başa çıkamaz.
Zachary Vance

başka bir dilde değil, pytho dilinde sorar. JQ ile mükemmel yapabilir.
Bui Anh Tuan

65

JSON Ruby Gem, JSON'u güzelleştirmek için bir kabuk komut dosyası ile birlikte gelir:

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

Komut dosyası indir: gist.github.com/3738968


6
Bu çözümün, Python ile aksine unicode "\ uxxxx" kaçış dizilerinin kodunu çözdüğünü unutmayın json.tool. Ancak, aynı zamanda yuvalama derinliği sınırlamaları ( nesting of 20 is too deep (JSON::NestingError)) da var gibi görünüyor .
a3nm

2
Ubuntu'da şunları yapabilirsiniz: sudo apt-get install ruby-json-purebunun yerinegem install
Janus Troelsen

1
`` eric-mbp: ~ ericstob $ sudo gem install json Şifre: Getirme: json-1.7.3.gem (% 100) Yerel uzantılar oluşturma. Bu biraz zaman alabilir ... Başarıyla yüklendi json-1.7.3 1 gem yüklendi json-1.7.3 için ri belgelerini yükleme ... json-1.7.3 için RDoc belgelerini yükleme ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: komut bulunamadı
Eric Hartford

belki senin içeriğini gönderebilir prettify_json.rb?
Andrew

Sen, senaryoyu indirebilir taşıyabilirsiniz ~/binklasörün yeniden adlandırma (bunun, PATH öyle yapın) prettify_json.rbiçin ppjve çalıştırın chmod +x ppj. Şimdi şöyle bir şey yapabilirsinizcurl www.jsonsring.com/something.json | ppj
Uri

58

GÜNCELLEMEjq Şimdi başka bir cevapta önerildiği gibi kullanıyorum . JSON'u filtrelemede son derece güçlü, ancak en temelde, JSON'u görüntülemek için güzel bir şekilde yazdırmanın harika bir yolu.

jsonpp çok güzel bir komut satırı JSON güzel yazıcı.

README'den:

Web hizmeti yanıtlarını şöyle yazdırın:

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

ve diskinizde dolaşan dosyaları güzelleştirin:

jsonpp data/long_malformed.json

Mac OS X kullanıyorsanız, bunu yapabilirsiniz brew install jsonpp. Değilse, ikiliyi, cihazınızdaki bir yere kopyalayabilirsiniz $PATH.


1
Jsonpp'i (geçmişte başarılı bir şekilde kullanılmış) büyük bir dosyaya (> 60MB) karşı denedim. 5 dakika sonra durdum. Ben python -mjson.tool(burada diğer cevaptan) içine boru ve 10-20 saniye aldı ...
volker

60MB JSON? Vaov! Genellikle büyük ama bilmek yararlı dosyalar ile ilgilenmiyorum. Teşekkürler.
jordelver

json_ppjsonpp
Ubuntu kutumda, json'u

56

Ben böyle yaparım:

curl yourUri | json_pp

Kodu kısaltır ve işi yapar.


3
Ubuntu sunucusu: Çok kısıtlı kurulumlara sahip üretim makineleriniz varsa, bu varsayılan olarak belirli bir ad altında kurulduğu için en iyi seçim olabilir. Python, sürüme bağlı olarak genellikle farklı şekillerde kurulur (örn. Python3, python veya hiç değil).
jonathanjo

55

güzel json baskı için basit bir bash betiği

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

Misal:

cat file.json | json_pretty.sh

1
Geri dönüşünüz için teşekkür ederiz. Bu senaryoyu kişisel kullanım için bugün yazdım ve vakalarımda iyi çalıştı. Düzeltmeler yaptım, şimdi daha küçük ve bu problemsiz. Tamamen formatı desteklemek için bir hedef yok, ancak gerekirse diğer düzeltmeleri de yapabilirim.
Evgeny Karpov

2
Bu sadece bulduğum çalışma cevabı. Ben desteklemediği biraz farklı awk var ... hiçbir RUBBY, hiçbir javascript, indir piton modülleri internete erişim yok - Ben gömülü bir linux var %*cdeğiştiğimi notasyonu printfiçin c=0; while (c++<offset) printf " "; printf $0;. Ve benim awk farklı regex kaçan vardır ve ters eğik çizgi çalışmıyor []. Normal ifadeleri /^[[{]/ve olarak değiştirdim /[]}]/.
Zaboj Campula

2
Bu, tam yerel olduğu ve üçüncü taraf yazılım gerektirmediği için kabul edilmelidir ...
Blag

1
@EvgenyKarpov güzel yakalamak, tam bir geri dönüşe gerek yok, sadece bu grepyanlışlıkla silindi;)
Blag

1
Teşekkürler ahbap, 8MB tek katlı json'u basit basit bash ile biçimlendirmenin hızlı bir yolunu istedim.
Ahmed M

53

Deneyin pjson. Renkleri var!

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

Yükleme yeri pip:

⚡ pip install pjson

Ve sonra herhangi bir JSON içeriğini kanalize edin pjson.


Python-pip (sudo apt-get install python-pip) ve sonra (sudo pip install pjson) gerektirir Büyük avantaj renklerdir!
Kristjan Adojaan

1
Dezavantajı renkli çıktı grep mümkün değildir.
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"
}

NOT: değil bunu yapmanın yolu.

Perl'de de aynı:

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

Not 2: Çalıştırırsanız

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

güzel okunabilir kelime \ u kodlanmış olur

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

Senin boru hattının kalan incelikle unicode idare edecek ve aynı zamanda insan dostu, basitçe olmak size JSON isterseniz kullanımı 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)'

ve elde edersiniz:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}

aslında aynı şeyi yapıyorum ama javascript kendisi ile :)
Robert Gould

2
Sahip olduğum JSON modülü sürümünde to_jsonseçenekleri kabul etmiyor gibi görünüyor. Ama bu işe yarıyor:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd

Python örneği basitleştirilebilir. JSON çıktısını doğrudan içine çekmek çok daha kolay python -m json.tool.
Dan Loewenherz

@ Dan: evet. json.toolKod örneklerini gösteren birkaç cevap var . 1. bu sürüm bazı parametreleri değiştirmek için izin verir, örneğin, indent2. Gönderme sırasında (2008) Python 2.4 hala desteklemiyor-mjson.tool
jfs

40

Jshon'u tam olarak tarif ettiğiniz şeyi yapmak için kullanıyorum . Sadece koş:

echo $COMPACTED_JSON_TEXT | jshon

JSON verilerini dönüştürmek için bağımsız değişkenler de iletebilirsiniz.


Teşekkürler, jshon aynı görev için python veya ruby ​​kullanmaktan çok daha hızlı
Alexander

2
@Alexander - Ne kadar hızlı bir yazıcıya ihtiyacınız var? Önceden yüklenmiş Python ile birlikte gelen OSx Lion'dayım. Python -mjson.tool ile oldukça 96s 96KB json dosyası yazdırabilirsiniz - jshon bağlanan earthporn json çıkışı yaklaşık 24 KB ve ben 0.08s oldukça yazdırabilirsiniz. Jshon sizin için ne kadar hızlı?
Joensson

1
1 + GB sıkıştırılmış (kim bile ne kadar büyük sıkıştırılmamış bilir) JSON veri dosyaları ile çalışıyorum, bu yüzden çok jshon daha hızlı öneri için teşekkür ederiz.
Ryan Ballantyne

38

Veya Ruby ile:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

Bu bana bir hata veriyor. Bazı ruby ​​json paketlerine ihtiyacınız var mı?
mjs

3
Evet, JSON Ruby Gem'e ihtiyacınız var: sudo gem install json
darscan

@MatSchaffer Nesneleri özel to_jsonyöntemlerle serileştirmek için JSON kullanıyorsanız bunun çalışmadığını unutmayın ; Kernel#jjsadece aynı dizileri ve karmaları (veya sayıları / dizeleri / booleans) güzel yazdırır.
Phrogz

Windows'ta şunu deneyin:echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill

36

Check Jazor . Ruby'de yazılmış basit bir komut satırı JSON ayrıştırıcısı.

gem install jazor
jazor --help

4
Sadece ben mi yoksa OP'nin sorusunu gerçekten cevaplayan tek öneri bu mu? Buraya çıktısını verebileceğim basit bir komut aramaya geldim curlve bu benim için yaptı.
Leo Cassarani

2
Çıktıyı renklendirme seçeneğine sahip olmasını seviyorum. Okumayı kolaylaştırır.
Andrew

ooh REST API'mın çıktısını görüntülemek için kullandığımdan beri bir url'yi geçirme seçeneğini seviyorum
Andrew

35

Sonuca ulaşmak için bu basit komutu kullanabilirsiniz:

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

Bence en iyi cevap. Küçük ve hatırlaması kolaydır ve standart olmayan herhangi bir araç kurmayı gerektirmez.
Eugene C

python -m json.tool, JSON nesnesinin sırasını korumuyor gibi görünüyor.
pushNpop


28

Sadece çıkışı boruya bağlayın jq ..

Misal:

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

Güzel cevap @Ackshaey Singh ve biri de kolayca bir dosyaya yeniden yönlendirebilirsiniz. ör.cat <file_name.txt> | jq . > <output_name.txt>
Pramit

9
brew install jqmac os üzerinde iseniz.
Distwo

1
Ne yazık ki, kullanılarak jq .oldukça-baskı için birine sahiptir potansiyel dezavantajı: Hassas kolayca çok büyük tamsayılar için örneğin kaybolur böylece JQ tüm kaybolmamış versiyonları, IEEE sayı olarak JSON numaraları tedavi konusunda ısrar ediyor.
zirve

2
@Pramit cat file |her zaman bir süreç kaybıdır; sadece jq . <file_name.txt >output_name.txt(değişmez <ve >karakterlerle) yapın.
Mark Reed

24

Pygmentize

Python'un json.tool'unu pygmentize ile birleştiriyorum:

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

Bu cevabımda listelenen bazı bölümlere ayırma alternatifleri var .

İşte canlı bir demo:

gösteri


5
Bazen pygmentize -l jsonrenklendirme için kullanmak gerekir.
JP

Apt paketi ile yükleyin python-pygments, yaniapt-get install python-pygments
Ocak

23

Perl ile, CPAN'dan JSON :: PP yüklerseniz json_pp komutunu alırsınız . Hırsızlık örnek dan B Bycroft elde edersiniz:

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

It yetmeyecek söz json_ppde Ubuntu 12.04 (en azından) ve Debian ile önceden yüklenmiş geliyor/usr/bin/json_pp


19

JSON :: XS perl modülünde bulunan json_xs komut satırı yardımcı programını kullanmanızı öneririm. JSON :: XS, JSON'un serileştirilmesi / serileştirilmesi için bir Perl modülüdür, Debian veya Ubuntu makinesinde şu şekilde yükleyebilirsiniz:

sudo apt-get install libjson-xs-perl

Tabii ki CPAN'da da mevcut .

Bir URL'den elde edilen JSON'u biçimlendirmek için bunu kullanmak için curl veya wget kullanabilirsiniz:

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

veya bu:

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

ve bir dosyada bulunan JSON'u biçimlendirmek için şunları yapabilirsiniz:

$ json_xs < file-full-of.json

Bazı insanların JSON'dan daha insanca okunabilir olduğunu düşündüğü YAML olarak yeniden biçimlendirmek için :

$ json_xs -t yaml < file-full-of.json

19

Sadece jq veya json_pp gibi standart araçları kullanabilirsiniz.

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

veya

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

her ikisi de çıktıyı aşağıdaki gibi güzelleştirecektir (jq daha da renkli):

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

Jq'nin en büyük avantajı, json'u ayrıştırmak ve işlemek isterseniz A LOT daha fazlasını yapabilmesidir.


json_pp Mac'imdeydi - ama jq değil. Teşekkürler!
David H

1
@DavidH - bu yardımcı oluyor: stackoverflow.com/questions/37668134/…
Schmitzi

Teşekkürler! Daha önce hiç jq duymamıştı.
David H

17

jj süper hızlı, devasa JSON belgelerini ekonomik olarak işleyebilir, geçerli JSON numaraları ile uğraşmaz ve kullanımı kolaydır, örn.

jj -p # for reading from STDIN

veya

jj -p -i input.json

(2018) hala oldukça yenidir, bu yüzden geçersiz JSON'u beklediğiniz gibi işlemeyebilir, ancak büyük platformlara yüklenmesi kolaydır.




12

Aşağıdaki komutla yajl-tools yazılımını kurun:

sudo apt-get install yajl-tools

sonra,

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


Muhteşem. Başka bir dil / tercüman gerektirmez ve paket repolarındadır, demlemeye gerek yoktur!
Joseph Lust
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.