JSONを人間が読める形式にフォーマットする(Unix)シェルスクリプトはありますか?
基本的に、私はそれが以下を変換することを望みます:
{ "foo": "lorem", "bar": "ipsum" }
...このようなものに:
{
"foo": "lorem",
"bar": "ipsum"
}
json
ライブラリを、私はよくGET構文の強調表示のようpygmentsを追加しました。
JSONを人間が読める形式にフォーマットする(Unix)シェルスクリプトはありますか?
基本的に、私はそれが以下を変換することを望みます:
{ "foo": "lorem", "bar": "ipsum" }
...このようなものに:
{
"foo": "lorem",
"bar": "ipsum"
}
json
ライブラリを、私はよくGET構文の強調表示のようpygmentsを追加しました。
回答:
Python 2.6以降では、次のことができます。
echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
または、JSONがファイル内にある場合は、次のようにできます。
python -m json.tool my_json.json
JSONがAPIなどのインターネットソースからのものである場合は、
curl http://my_url/ | python -m json.tool
これらすべてのケースで便利なように、エイリアスを作成できます。
alias prettyjson='python -m json.tool'
もう少しタイピングして準備を整えると、さらに便利になります。
prettyjson_s() {
echo "$1" | python -m json.tool
}
prettyjson_f() {
python -m json.tool "$1"
}
prettyjson_w() {
curl "$1" | python -m json.tool
}
上記のすべての場合。これを入れる.bashrc
とシェルでいつでも利用できます。のように呼び出しprettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
ます。
pygmentize -l javascript
、コマンドラインで構文色の出力を取得できます。編集:pygmentsがインストールされている場合は、それです。
alias pretty='python -mjson.tool | pygmentize -l json
私はちょうど実行できるように:command params | pretty
。お役に立てれば。PS:誰かがこれを拡張して、a)毎回目にするcurl-outputを削除したり、b)jsonキーをソートしたりしないでください。私に知らせてください、私は非常に感謝します。
以下を使用できます。 jq
使い方はとても簡単で、とてもうまくいきます!ストリームを含む非常に大きなJSON構造を処理できます。あなたはここで彼らのチュートリアルを見つけることができます。
使用例:
$ 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"
}
。アイデンティティーフィルターです。
--sort-keys
いくつかの場合に役立つオプションもあります。
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
。
<<<
オペレーターを見つけてとても嬉しい–まさに私が探していたもの。
JSON.stringify
JavaScriptでJSONをきれいに出力するために「スペース」引数を使用します。
例:
// 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を使用したUnixコマンドラインから、コマンドラインでJSONを指定します。
$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
'{"foo":"lorem","bar":"ipsum"}'
戻り値:
{
"foo": "lorem",
"bar": "ipsum"
}
Node.jsを使用するUnixコマンドラインから、JSONを含むファイル名を指定し、4つのスペースのインデントを使用します。
$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
.readFileSync(process.argv[1])), null, 4));" filename.json
パイプを使用する:
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));\
});\
"
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
。結果をSTDOUTに出力します。
私は、利用可能な最高の「スマートホワイトスペース」フォーマッタの1つを備えたツールを作成しました。これは、ここにある他のほとんどのオプションよりも読みやすく、冗長でない出力を生成します。
これは、「スマートスペース」のようになります。
私は少し偏っているかもしれませんが、コマンドラインからJSONデータを印刷および操作するための素晴らしいツールです。非常に使いやすく、豊富なコマンドラインヘルプ/ドキュメントがあります。それは私が1001の異なる小さなタスクに使用するスイスアーミーナイフです。
最新の使用例:Chrome、Devコンソール、ネットワークタブ、すべてをHARファイルとしてエクスポート、「cat site.har | underscore select '.url' --outfmt text | grep mydomain」; これで、会社のサイトのロード中に行われたすべてのURLフェッチの時系列のリストが得られました。
きれいな印刷は簡単です:
underscore -i data.json print
同じこと:
cat data.json | underscore print
同じこと、もっと明確:
cat data.json | underscore print --outfmt pretty
このツールは私の現在の情熱プロジェクトなので、機能のリクエストがあれば、私がそれらに対処する可能性が高いです。
[32m
、[33m
、[39m
JSONが有効でない可能おり、それらのそれぞれの前にいくつかの非印字と一緒に。ただし、アンダースコア印刷だけではファイルには何も追加されず、そのフォーマット作業は完全に行われます。
jq
が、これは二重引用符が付いていない "JSON"に最適です。
私は通常、ただ行います:
echo '{"test":1,"test2":2}' | python -mjson.tool
選択したデータを取得するには(この場合は、「test」の値):
echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'
JSONデータがファイル内にある場合:
python -mjson.tool filename.json
curl
認証トークンを使用してコマンドラインですべてを一度に実行したい場合:
curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
JF Sebastianの非常に役立つポインタのおかげで、私が思いついた少し強化されたスクリプトを次に示します。
#!/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))
dict
オブジェクトには定義された順序がありません。試してみるjson.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
と、とにかく交換されていることがわかります。修正するには、をインポートOrderedDict
してload
渡しobject_pairs_hook=OrderedDict
ます。
inputFile = sys.stdin
。これはあなたのようにのようなスクリプトへのパイプのようなものをすることができます:curl http://somewhere.com/foo.json | pp_json.py
from collections import OrderedDict
。
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=(',', ': '))"
ました。末尾の空白が追加されないように、区切り文字は( '、'、 ':')に設定する必要があります。bugs.python.org
sort_keys = True
私は、JSONファイルを比較するために、これを使用すると、それは魔法のように動作するので、代わりに。
Perlでは、CPANモジュールを使用しますJSON::XS
。コマンドラインツールをインストールしますjson_xs
。
検証:
json_xs -t null < myfile.json
JSONファイルsrc.json
をpretty.json
次のように整えます。
< src.json json_xs > pretty.json
お持ちでない場合はjson_xs
、お試しくださいjson_pp
。"pp"は "pure perl"を表します–このツールはPerlのみで実装され、外部Cライブラリ(XSはPerlの "Extension System"を表すもの)へのバインドはありません。
-t null
nullを与えました:有効なtoformatではありません...しかしそれを省略することは素晴らしい働きをしました ありがとう。
* nixでは、stdinからの読み取りとstdoutへの書き込みがうまく機能します。
#!/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)
これをPATH 内のファイル(AnCの回答にちなんで「prettyJSON」と名付けました)に入れれchmod +x
ば、問題ありません。
fileinput.input()
、コマンドラインで指定したファイルがない場合は標準入力から読み込みます。例
JSON Ruby Gemには、JSONを美化するためのシェルスクリプトがバンドルされています。
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
スクリプトのダウンロード: gist.github.com/3738968
json.tool
。ただし、ネスト深度の制限もあるようです(nesting of 20 is too deep (JSON::NestingError)
)。
sudo apt-get install ruby-json-pure
代わりにgem install
prettify_json.rb
か?
~/bin
フォルダーに移動して(PATHにあることを確認してください)、名前prettify_json.rb
をに変更しppj
て実行しchmod +x ppj
ます。今、あなたは次のようなことができますcurl www.jsonsring.com/something.json | ppj
使用している更新jq
別の回答で提案されているように、今ています。JSONのフィルタリングには非常に強力ですが、最も基本的には、JSONをきれいに表示して表示するための素晴らしい方法でもあります。
jsonppは、非常に優れたコマンドラインJSONプリティプリンターです。
READMEから:
次のようなきれいなWebサービス応答を印刷します。
curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp
そして、ディスク上で実行されているファイルを美しくします。
jsonpp data/long_malformed.json
Mac OS Xを使用している場合は、次のことができbrew install jsonpp
ます。そうでない場合は、バイナリをのどこかにコピーするだけ$PATH
です。
python -mjson.tool
(ここでの他の回答から)パイプし、10〜20秒かかりました...
json_pp
-があります-これはjsonをうまくフォーマットしますが、命名は似ていますが、これはjsonpp
ここで述べたものとはまったく異なるプロジェクトだと
それが私のやり方です:
curl yourUri | json_pp
それはコードを短くして、仕事を終わらせます。
かなりのjson印刷用の単純なbashスクリプト
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}'
例:
cat file.json | json_pretty.sh
%*c
表記がサポートされていないawkが少し違うので、をに変更しprintf
ましたc=0; while (c++<offset) printf " "; printf $0;
。そして、私のawkはエスケープする正規表現が異なり、バックスラッシュはで機能しません[]
。正規表現を/^[[{]/
とに変更しました/[]}]/
。
grep
それだけが誤って削除されました;)
$ 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"
}
注:それはない、それを行う方法。
Perlでも同じ:
$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}),
> {pretty=>1})'
{
"bar" : "ipsum",
"foo" : "lorem"
}
注2:実行する場合
echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
sort_keys=True, indent=4))'
読みやすい単語は\ uエンコードされます
{
"D\u00fcsseldorf": "lorem",
"bar": "ipsum"
}
あなたのパイプラインの残りの部分は、優雅にUnicodeを処理すると、あなたも人に優しい、単純であるためにあなたのJSONを希望した場合の使用 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)'
あなたが得るでしょう:
{
"Düsseldorf": "lorem",
"bar": "ipsum"
}
to_json
オプションを受け付けていないようです。しかし、これは動作します:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
です。
json.tool
コード例を示すいくつかの回答があります。1.このバージョンでは、いくつかのパラメーターを変更できますindent
。例:2.投稿(2008)の時点では、Python 2.4がまだ使用されていません-mjson.tool
私はjshonを使用して、あなたが説明していることを正確に実行します。ただ走れ:
echo $COMPACTED_JSON_TEXT | jshon
引数を渡してJSONデータを変換することもできます。
または、Rubyの場合:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
to_json
メソッドでオブジェクトをシリアル化している場合は機能しないことに注意してください。Kernel#jj
同じ配列(または数値/文字列/ブール値)の配列とハッシュのみを表示します。
echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
curl
、これが私のためにそれを実行した唯一のコマンドです。
JSONLintのGitHubにはオープンソースの実装があり、コマンドラインで使用したり、Node.jsプロジェクトに組み込んだりできます。
npm install jsonlint -g
その後
jsonlint -p myfile.json
または
curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
出力をにパイプするだけjq .
です。
例:
twurl -H ads-api.twitter.com '.......' | jq .
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
あなたがmac osを使っているなら。
jq .
pretty-printingの使用には1つの潜在的な欠点があります。jqの現存するすべてのバージョンは、JSON番号をIEEE番号として扱うことを要求しているため、非常に大きな整数などでは、精度が簡単に失われます。
cat file |
は常にプロセスの無駄です。ただjq . <file_name.txt >output_name.txt
(リテラル<
と>
文字で)行います。
Perlでは、CPANからJSON :: PPをインストールすると、json_ppコマンドが表示されます。B Bycroftから例を盗むと、次のようになります。
[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
"bar" : "ipsum",
"foo" : "lorem"
}
json_pp
Ubuntu 12.04(少なくとも)とDebianにプリインストールされていることは言及する価値があります/usr/bin/json_pp
JSON :: XS perlモジュールに含まれているjson_xsコマンドラインユーティリティを使用することをお勧めします。JSON :: XSはJSONをシリアライズ/デシリアライズするためのPerlモジュールであり、DebianまたはUbuntuマシンに次のようにインストールできます。
sudo apt-get install libjson-xs-perl
明らかにCPANでも利用できます。
これを使用してURLから取得したJSONをフォーマットするには、次のようにcurlまたはwgetを使用できます。
$ curl -s http://page.that.serves.json.com/json/ | json_xs
またはこれ:
$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs
ファイルに含まれるJSONをフォーマットするには、次のようにします。
$ json_xs < file-full-of.json
一部の人々がJSONよりも人が読みやすいと考えるYAMLとして再フォーマットするには:
$ json_xs -t yaml < file-full-of.json
jqやjson_ppなどの標準ツールを使用するだけで済みます。
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
または
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
どちらも次のように出力をきれいにします(jqはさらにカラフルです)。
{
"foo": "lorem",
"bar": "ipsum"
}
jqの大きな利点は、jsonを解析して処理したい場合に、より多くのことができることです。
bat
cat
構文を強調表示したクローンです:
例:
echo '{"bignum":1e1000}' | bat -p -l json
-p
ヘッダーなしで出力し-l
、言語を明示的に指定します。
JSONの色と書式があり、このコメントに記載されている問題はありません。JSONをシェルスクリプトできれいに印刷するにはどうすればよいですか?
以下のコマンドを使用してyajl-toolsをインストールします。
sudo apt-get install yajl-tools
その後、
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat