人間が読める形式で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
に入れることができ、それはShellで毎回利用可能になります。 prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
のように起動します。
JavaScriptでJSONをきれいに印刷するために JSON.stringify
の "space"引数を使います。
例:
// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);
// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');
UNIXのコマンドラインからnodejsを使用して、コマンドラインで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 |アンダースコアの選択 '.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
J.F. 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 __== "__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"は "純粋なPerl"のためのものです - このツールはPerlでのみ実装されていて、外部のCライブラリへの束縛はありません(XSがPerlの "Extension System"を表しているものです)。
* nixでは、標準入力からの読み取りと標準出力への書き込みのほうがうまくいきます。
#!/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
それを入れてください。
JSON Ruby Gemには、JSONを見分けやすくするためのシェルスクリプトがバンドルされています。
Sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
スクリプトのダウンロード: Gist.github.com/3738968
_ update _ 他の回答で示唆されているように、私は今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
のどこかにコピーするだけです。
$ 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))'
読みやすいWordは\ uエンコードされます
{
"D\u00fcsseldorf": "lorem",
"bar": "ipsum"
}
パイプラインの残りの部分がユニコードを適切に処理し、JSONも人間に優しいものにしたい場合は、単純に seensure_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"
}
それが私のやり方です。
curl yourUri | json_pp
それはコードを短くし、仕事をやり遂げます。
私は jshon を使用して、記述していることを正確に実行します。とにかく走れ:
echo $COMPACTED_JSON_TEXT | jshon
JSONデータを変換するために引数を渡すこともできます。
Jazor をチェックしてください。これはRubyで書かれたシンプルなコマンドラインのJSONパーサです。
gem install jazor
jazor --help
または、Rubyの場合:
echo '{ "foo": "lorem", "bar": "ipsum" }' | Ruby -r json -e 'jj JSON.parse gets'
出力を単純にjq .
に渡します。
例:
twurl -H ads-api.Twitter.com '.......' | jq .
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
Pythonのjson.toolとpygmentizeを組み合わせます:
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
my this answer にリストされているpygmentizeに代わるものがいくつかあります。
ライブデモは次のとおりです。
きれいなJSON印刷用のシンプルなBashスクリプト(grep
/awk
)。
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
cat fileIn.json |sh.exe json_pretty.sh > fileOut.json
Perlでは、CPANから JSON :: PP をインストールすると、 json_pp コマンドが表示されます。 example から 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
私の経験では yajl
はとてもいいです。 json_reformat
に次の行を追加することで、.json
コマンドを使用してvim
内の.vimrc
ファイルをきれいに印刷します。
autocmd FileType json setlocal equalprg=json_reformat
PHP>がある場合はPHPバージョン= 5.4。
alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json
Rubyを一行で使う:
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
bat
は、構文の強調表示付きのcat
クローンです。 https://github.com/sharkdp/bat
例:
echo '{"bignum":1e1000}' | bat -p -l json
-p
はヘッダーなしで出力し、-l
は明示的に言語を指定します。
それはjsonのためのカラーリングとフォーマットを持っていて、notこのコメントで述べられている問題を持っていません: どうやったらシェルスクリプトでJSONをきれいに印刷できますか?
私は使っています 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
}
私はこの質問に対する答えが吐き気であることを知っていますが、私はJsonの見栄えのするコマンドよりも優れたRubyソリューションを文書化したいと思いました。gem colorful_json
はかなり良いものです。
gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
"foo": "lorem",
"bar": "ipsum"
}
J.F. Sebastianの解決策はUbuntu 8.04ではうまくいきませんでした。
これは古い1.XのJSONライブラリで動作するPerlの修正版です。
Perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
あなたは結果を達成するためにこの簡単なコマンドを使うことができます。
$ Sudo apt-get install edit-json
$ prettify_json myfile.json
これは Groovy scriptでそれを行う方法です。
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
ツールydump
はJSONプリティプリンタです。
$ ydump my_data.json
{
"foo": "lorem",
"bar": "ipsum"
}
あるいは、JSONをパイプインすることもできます。
$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
"foo": "lorem",
"bar": "ipsum"
}
これはjq
ツールを使用することを除いておそらく最短の解決策です。
このツールは OCaml のyojson
ライブラリの一部であり、 ここ で文書化されています。
Debianとその派生物では、パッケージlibyojson-ocaml-dev
にこのツールが含まれています。あるいは、yojson
は _ opam _ を介してインストールすることができます。
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}))}}))"
私は 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
Node.jsがインストールされている場合は、1行のコードで自分でNode.jsを作成できます。きれいなファイルを作る:
>かわいい
#!/usr/bin/env node
console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));
実行権限を追加します。
> chmod + xプリティ
> ./pretty '{"foo": "lorem"、 "bar": "ipsum"}'
JSONがファイルに含まれている場合
#!/usr/bin/env node
console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));
> ./pretty file.json
JavaScript/NodeJSの場合: vkBeautify.jsプラグイン を見てください。これはJSONとXMLの両方のテキストをきれいに印刷します。
それは普通のJavaScriptで書かれていて、1.5KB(縮小)以下でとても速いです。
これがGroovyのワンライナーです。
echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
https://github.com/aidanmelen/json_pretty_print
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import print_function
from __future__ import division
import json
import jsonschema
def _validate(data):
schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
try:
jsonschema.validate(data, schema,
format_checker=jsonschema.FormatChecker())
except jsonschema.exceptions.ValidationError as ve:
sys.stderr.write("Whoops, the data you provided does not seem to be " \
"valid JSON.\n{}".format(ve))
def pprint(data, python_obj=False, **kwargs):
_validate(data)
kwargs["indent"] = kwargs.get("indent", 4)
pretty_data = json.dumps(data, **kwargs)
if python_obj:
print(pretty_data)
else:
repls = (("u'",'"'),
("'",'"'),
("None",'null'),
("True",'true'),
("False",'false'))
print(reduce(lambda a, kv: a.replace(*kv), repls, pretty_data))
gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty
このメソッドは " HTTPレスポンス/ヘッダを検出し、手を付けずに表示し、本文へスキップします(`。curl -i 'と共に使用します) " .
Nodejsを使用した1行のソリューションはこのようになります
$ node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
例えば:
$ cat test.json | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
smk を使用できます。
echo '{"foo": "lorem", "bar": "ipsum"}' | smk -e"JSON.stringify(JSON.parse(data), null, 4)"
一行で
echo '{"foo": "lorem", "bar": "ipsum"}' | npx smk -e"JSON.stringify(JSON.parse(data), null, 4)"
サードパーティ製のツールを使用しても構わない場合は、 jsonprettyprint.org にアクセスしてください。これはマシンにパッケージをインストールできない場合のためです。
curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'
私のJSONファイルはこれらの方法のどれによっても解析されませんでした。
私の問題はこの記事に似ていました Google Data Source JSONが無効ですか? 。
その投稿への答えは私が解決策を見つけるのを助けました。 https://stackoverflow.com/a/628634/619760
文字列キーがないと無効な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/ に導いた。私はこの一つのパーサが他の多くのものよりはるかにフォールトトレラントであると思います。
Xidel を使用できます。
Xidelは、CSS、XPath 3.0、XQuery 3.0、JSONiq、またはパターンテンプレートを使用して、HTML/XMLページまたはJSON-APIからデータをダウンロードして抽出するためのコマンドラインツールです。新規または変換されたXML/HTML/JSON文書を作成することもできます。
Xidelはデフォルトでプリティプリントを行います。
$ xidel -s - -e '$json' <<< '{"foo":"lorem","bar":"ipsum"}'
{
"foo": "lorem",
"bar": "ipsum"
}
または
$ echo '{"foo":"lorem","bar":"ipsum"}' | xidel -s - -e .
{
"foo": "lorem",
"bar": "ipsum"
}