JSONを人間が読める形式にフォーマットする(Unix)シェルスクリプトはありますか?
基本的に、私はそれが以下を変換したいです:
{ "foo": "lorem", "bar": "ipsum" }
...このようなものに:
{
"foo": "lorem",
"bar": "ipsum"
}
JSONを人間が読める形式にフォーマットする(Unix)シェルスクリプトはありますか?
基本的に、私はそれが以下を変換したいです:
{ "foo": "lorem", "bar": "ipsum" }
...このようなものに:
{
"foo": "lorem",
"bar": "ipsum"
}
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"}'
ます。
以下のコメントで @pnd が指摘しているように、Python 3.5 以降では、JSON オブジェクトはデフォルトでソートされなくなっていることに注意してください。--sort-keys
並べ替えるには、最後にフラグを追加します。すなわち... | python -m json.tool --sort-keys
。
以下を使用できます。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"
}
またはjq
、ID フィルターで使用します。
$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"
の「space」引数を使用して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));\
});\
"
利用可能な最高の「スマート空白」フォーマッタの 1 つを備えたツールを作成しました。ここにある他のほとんどのオプションよりも読みやすく、詳細度の低い出力が生成されます。
これは「スマート空白」がどのように見えるかです:
少し偏見があるかもしれませんが、コマンドラインから JSON データを出力および操作するための素晴らしいツールです。非常に使いやすく、広範なコマンドライン ヘルプ/ドキュメントがあります。これは、1001 種類の小さなタスクに使用するスイス アーミー ナイフであり、他の方法では驚くほど面倒です。
最新のユースケース: Chrome、開発コンソール、[ネットワーク] タブ、すべてを 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
このツールは私が現在情熱を注いでいるプロジェクトなので、機能のリクエストがあれば、対応できる可能性が高いです。
私は通常ただします:
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))
npm と Node.js を使用している場合はnpm install -g json
、コマンドを実行して、パイプでパイプすることができますjson
。json -h
すべてのオプションを取得するために実行します。また、特定のフィールドを引き出して、出力を で色付けすることもできます-i
。
curl -s http://search.twitter.com/search.json?q=node.js | 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」は「pureperl」を表します。ツールはPerlでのみ実装され、外部Cライブラリ(XSの略であるPerlの「拡張システム」)にバインドされません。
*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)
これをファイル( AnCの回答にちなんで「prettyJSON」と名付けました)に PATH に入れて、準備完了chmod +x
です。
JSON Ruby Gem には、JSON を整形するためのシェル スクリプトがバンドルされています。
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
スクリプトのダウンロード: gist.github.com/3738968
$ 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"
}
更新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
. そうでない場合は、単にバイナリを .xml のどこかにコピーできます$PATH
。
私はjshonを使用して、あなたが説明していることを正確に実行します。とにかく走れ:
echo $COMPACTED_JSON_TEXT | jshon
引数を渡してJSONデータを変換することもできます。
または、Ruby の場合:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
Jazorをチェックしてください。これは、Ruby で記述された単純なコマンド ライン JSON パーサーです。
gem install jazor
jazor --help
JSONLintには、コマンド ラインで使用したり、Node.js プロジェクトに含めたりできるオープンソースの実装が GitHubにあります。
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 .
Python の json.tool と pygmentize を組み合わせます。
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
私のこの回答にリストされているpygmentizeの代替手段がいくつかあります。
ライブデモは次のとおりです。
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
YAMLとして再フォーマットするには、JSON よりも人間が判読できると考える人もいます。
$ json_xs -t yaml < file-full-of.json
jjは超高速で、莫大な量の JSON ドキュメントを経済的に処理でき、有効な JSON 番号を台無しにせず、使いやすいです。
jj -p # for reading from STDIN
また
jj -p -i input.json
(2018 年) まだかなり新しいので、期待どおりに無効な JSON を処理しないかもしれませんが、主要なプラットフォームに簡単にインストールできます。
以下のコマンドでyajl-toolsをインストールします。
sudo apt-get install yajl-tools
それから、
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
Ruby を 1 行で使用する:
echo '{"test":1,"test2":2}' | ruby -e "require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))"
そして、これにエイリアスを設定できます:
alias to_j="ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""
そしたらもっと便利に使えます
echo '{"test":1,"test2":2}' | to_j
{
"test": 1,
"test2": 2
}
また、JSON を色付きで表示したい場合は、インストールawesome_print
して、
gem install awesome_print
それから
alias to_j="ruby -e \"require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)\""
それを試してみてください!
echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j
これは、Json の prettify コマンドよりも優れた Ruby ソリューションです。宝石colorful_json
はかなり良いです。
gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
"foo": "lorem",
"bar": "ipsum"
}
yajl
私の経験では、とてもいいです。my に次の行を追加して、そのコマンドを使用してファイルjson_reformat
をきれいに印刷します。.json
vim
.vimrc
autocmd FileType json setlocal equalprg=json_reformat
httpieを使用しています
$ pip install httpie
そして、あなたはそれをこのように使うことができます
$ http PUT localhost:8001/api/v1/ports/my
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 93
Content-Type: application/json
Date: Fri, 06 Mar 2015 02:46:41 GMT
Server: nginx/1.4.6 (Ubuntu)
X-Powered-By: HHVM/3.5.1
{
"data": [],
"message": "Failed to manage ports in 'my'. Request body is empty",
"success": false
}
JF Sebastian のソリューションは、Ubuntu 8.04 ではうまくいきませんでした。
これは、古い 1.X JSON ライブラリで動作する変更された Perl バージョンです。
perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
TidyJSONがあります。
これはC#なので、 Monoでコンパイルして、*nixで作業できるかもしれません。保証はありませんが、申し訳ありません。
Node.js の場合は、「util」モジュールも使用できます。構文の強調表示、スマートなインデントを使用し、キーから引用符を削除し、出力を可能な限りきれいにします。
cat file.json | node -e "process.stdin.pipe(new require('stream').Writable({write: chunk => {console.log(require('util').inspect(JSON.parse(chunk), {depth: null, colors: true}))}}))"
このツールydump
は、JSON プリティ プリンターです。
$ ydump my_data.json
{
"foo": "lorem",
"bar": "ipsum"
}
または、JSON をパイプすることもできます。
$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
"foo": "lorem",
"bar": "ipsum"
}
これはおそらく、jq
ツールを使用する以外の最短のソリューションです。
このツールはOCamlyojson
のライブラリの一部であり、ここに文書化されています。
Debian および派生物では、パッケージlibyojson-ocaml-dev
にこのツールが含まれています。または、OPAMyojson
を介してインストールできます。
$ sudo apt-get install edit-json
$ prettify_json myfile.json
これをGroovyスクリプトで行う方法を次に示します。
Groovy スクリプトを作成します。たとえば、「pretty-print」としましょう。
#!/usr/bin/env groovy
import groovy.json.JsonOutput
System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) }
スクリプトを実行可能にします。
chmod +x pretty-print
コマンドラインから、
echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print
私はこの解決策を思いつきました: https://calbertts.medium.com/unix-pipelines-with-curl-requests-and-serverless-functions-e21117ae4c65
# this in your bash profile
jsonprettify() {
curl -Ss -X POST -H "Content-Type: text/plain" --data-binary @- https://jsonprettify.vercel.app/api/server?indent=$@
}
echo '{"prop": true, "key": [1,2]}' | jsonprettify 4
# {
# "prop": true,
# "key": [
# 1,
# 2
# ]
# }
何もインストールする必要はありません。インターネット接続と cURL がインストールされていれば、この機能を使用できます。
何もインストールできない別のホストにいる場合、これはその問題の完璧な解決策です。
私はjson-linerの作者です。これは、JSONをgrepに適した形式に変換するためのコマンドラインツールです。試してみる。
$ echo '{"a": 1, "b": 2}' | json-liner
/%a 1
/%b 2
$ echo '["foo", "bar", "baz"]' | json-liner
/@0 foo
/@1 bar
/@2 baz
gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty
このメソッドは、「HTTP 応答/ヘッダーを検出し、それらをそのまま出力し、本文にスキップします (`curl -i' で使用するため)」 .
Groovy のワンライナーを次に示します。
echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
JavaScript/Node.js を使用する場合: vkBeautify.js プラグインを見てください。これは、JSON と XML テキストの両方のきれいな印刷を提供します。
これはプレーンな JavaScript で書かれており、1.5 KB (縮小) 未満で、非常に高速です。
私の JSON ファイルは、これらの方法のいずれによっても解析されませんでした。
私の問題は投稿に似ていましたGoogle データソース JSON は無効ですか? .
その投稿への回答は、解決策を見つけるのに役立ちました。
文字列キーがない無効な JSON と見なされます。
{id:'name',label:'Name',type:'string'}
でなければなりません:
{"id": "name", "label": "Name", "type": "string"}
このリンクは、いくつかの異なる JSON パーサーの優れた包括的な比較を提供します: http://deron.meranda.us/python/comparing_json_modules/basic
これにより、http://deron.meranda.us/python/demjson/にたどり着きました。この 1 つのパーサーは、他の多くのパーサーよりもはるかにフォールト トレラントであると思います。
コンソールで json ログを視覚化する場合は、 munia-pretty-jsonを使用できます
npm install -g munia-pretty-json
json データ (app-log.json)
{"time":"2021-06-09T02:50:22Z","level":"info","message":"Log for pretty JSON","module":"init","hostip":"192.168.0.138","pid":123}
{"time":"2021-06-09T03:27:43Z","level":"warn","message":"Here is warning message","module":"send-message","hostip":"192.168.0.138","pid":123}
次のコマンドを実行します。
munia-pretty-json app-log.json
コンソールで読み取り可能な出力は次のとおりです。
テンプレートを使用して出力をフォーマットできます。デフォルトのテンプレートは'{time} {level -c} {message}'
テンプレートの使用:
munia-pretty-json -t '{module -c} - {level} - {message}' app-log.json
出力:
必要に応じて、代わりにオンライン ツールを使用することもできます。
http://jsonprettyprint.netが最もシンプルで簡単だと思います。
元の投稿がシェル スクリプトを要求したことは知っていますが、有用で無関係な回答が非常に多く、おそらく元の作成者には役立たなかったでしょう。無関係に追加:)
ところで、コマンド ライン ツールを動作させることができませんでした。
シンプルな JSON JavaScript コードが必要な場合は、次のようにします。
JSON.stringfy(JSON.parse(str), null, 4)
http://www.geospaces.org/geoweb/Wiki.jsp?page=JSON%20Utilities%20デモ
JSON をきれいにするだけでなく、属性または属性とレベルで並べ替える JavaScript コードを次に示します。
入力が
{ "c": 1, "a": {"b1": 2, "a1":1 }, "b": 1},
次のいずれかを出力します (すべてのオブジェクトをまとめてグループ化します)。
{
"b": 1,
"c": 1,
"a": {
"a1": 1,
"b1": 2
}
}
または (キーによる注文のみ):
{
"a": {
"a1": 1,
"b1": 2
},
"b": 1,
"c": 1
}