シェルスクリプトでJSONをプリティプリントするにはどうすればよいですか?

3170
16 revs, 12 users 29% AnC 2008-12-09 22:20.

JSONを人間が読める形式にフォーマットする(Unix)シェルスクリプトはありますか?

基本的に、私はそれが以下を変換したいです:

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

...このようなものに:

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

30 answers

4612
campovski 2009-12-17 23:48.

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 --save-keys

1123
Vita Pluvia 2013-03-06 08:34.

次を使用できます。 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"
388
Krinkle 2010-07-13 03:00.

の「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));\
 });\
"
341
Dave Dopson 2012-05-02 06:48.

私は、利用可能な最高の「スマートホワイトスペース」フォーマッターの1つを備えたツールを作成しました。ここにある他のほとんどのオプションよりも読みやすく、冗長性の少ない出力を生成します。

アンダースコア-cli

これは「スマートホワイトスペース」がどのように見えるかです:

私は少し偏見があるかもしれませんが、コマンドラインから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

このツールは私の現在の情熱的なプロジェクトなので、機能のリクエストがあれば、私がそれらに対処する可能性が高いです。

175
locojay 2011-11-01 15:19.

私は通常ただします:

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

そして、選択したデータ(この場合は「テスト」の値)を取得するには:

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
90
2 revs, 2 users 95% AnC 2008-12-10 12:22.

JFセバスティアンの非常に役立つポインターのおかげで、私が思いついたわずかに拡張されたスクリプトを次に示します。

#!/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))
86
gregers 2011-01-30 14:46.

npmとNode.jsを使用する場合はnpm install -g json、コマンドを実行してからパイプすることができますjson。やるjson -hすべてのオプションを取得します。また、特定のフィールドを引き出して、出力を-i。で色付けすることもできます。

curl -s http://search.twitter.com/search.json?q=node.js | json
81
Peter Mortensen 2017-05-19 05:47.

jqツールを使用したネイティブな方法ではそれほど単純ではありません。

例えば:

cat xxx | jq .
73
knb 2010-07-01 04:31.

Perlでは、CPANモジュールを使用しますJSON::XS。コマンドラインツールをインストールしますjson_xs

検証:

json_xs -t null < myfile.json

JSONファイルsrc.jsonpretty.json次のようにプリティファイします。

< src.json json_xs > pretty.json

お持ちでない場合はjson_xs、お試しくださいjson_pp。「pp」は「純粋なperl」を表します。ツールはPerlでのみ実装され、外部Cライブラリ(XSの略であるPerlの「拡張システム」)にバインドされません。

70
Daryl Spitzer 2009-07-31 14:51.

* 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です。

65
Paul Horsfall 2009-12-30 06:36.

JSON Ruby Gemは、JSONを美しくするためのシェルスクリプトにバンドルされています。

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

スクリプトのダウンロード:gist.github.com/3738968

58
jordelver 2013-05-21 23:18.

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です。

58
Evgeny Karpov 2016-07-27 21:54.

かなりの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
57
JedatKinports 2017-02-03 11:23.

それが私がそれをする方法です:

curl yourUri | json_pp

それはコードを短縮し、仕事を成し遂げます。

53
J.F. Sebastian 2008-12-09 22:52.
$ 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"
}
53
Johann Philipp Strathausen 2013-01-30 02:23.

試してみてくださいpjson。色あり!

でインストールしてくださいpip

⚡ pip install pjson

次に、JSONコンテンツをにパイプしますpjson

40
yardena 2011-05-20 13:51.

私はjshonを使用して、あなたが説明していることを正確に実行します。ただ走れ:

echo $COMPACTED_JSON_TEXT | jshon

引数を渡してJSONデータを変換することもできます。

40
Arpit Rathod 2018-07-17 02:09.

この簡単なコマンドを使用して、次の結果を得ることができます。

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
38
darscan 2009-10-21 23:10.

または、Rubyの場合:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
36
Mike Conigliaro 2011-01-26 08:35.

Jazorをチェックしてください。これは、Rubyで記述された単純なコマンドラインJSONパーサーです。

gem install jazor
jazor --help
31
Salman A 2012-04-28 00:37.

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
29
Benjamin W. 2016-10-04 13:29.

出力をにパイプするだけjq .です。

例:

twurl -H ads-api.twitter.com '.......' | jq .
25
Philip Durbin 2011-10-08 08:27.

Perlでは、CPANからJSON :: PPをインストールすると、json_ppコマンドを取得できます。B Bycroftから例を盗むと、次のようになります。

[[email protected] ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

json_ppUbuntu 12.04(少なくとも)とDebianがプリインストールされていることは言及する価値があります/usr/bin/json_pp

24
Shubham Chaudhary 2015-08-28 00:09.

Pygmentize

Pythonのjson.toolをpygmentizeと組み合わせます。

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

私のこの回答にリストされているpygmentizeのいくつかの選択肢があります。

これがライブデモです:

24
Schmitzi 2019-10-01 03:11.

jqやjson_ppなどの標準ツールを使用するだけです。

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

または

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

どちらも次のように出力を美しくします(jqはさらにカラフルです):

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

jqの大きな利点は、jsonを解析して処理したい場合に、より多くのことを実行できることです。

19
htaccess 2011-02-03 12:06.

JSON :: XSperlモジュールに含まれている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
19
peak 2018-02-26 03:50.

jjは超高速で、巨大なJSONドキュメントを経済的に処理でき、有効なJSON番号を台無しにせず、使いやすいです。

jj -p # for reading from STDIN

または

jj -p -i input.json

(2018)はまだかなり新しいので、無効なJSONを期待どおりに処理できない可能性がありますが、主要なプラットフォームに簡単にインストールできます。

17
Grav 2018-09-03 21:15.

batcat構文が強調表示されたクローンです。

例:

echo '{"bignum":1e1000}' | bat -p -l json

-pヘッダーなしで出力し-l、言語を明示的に指定します。

JSONの色付けとフォーマットがあり、このコメントに記載されている問題はありませ。シェルスクリプトでJSONをきれいに印刷するにはどうすればよいですか?

16
alexanderjsingleton 2017-09-16 10:38.
  1. brew install jq
  2. command + | jq
  3. (例:curl localhost:5000/blocks | jq
  4. 楽しい!

14
Uma sankar pradhan 2012-11-24 03:30.

以下のコマンドでyajl-toolsをインストールします。

sudo apt-get install yajl-tools

その後、

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

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

ジョエル・マクヘイル、マイク・コルター(スクリーンショット:Netflix)「私の神よ、これは1つのことを変えます。」これは、ジョエル・マクヘイルとのジョエル・マクヘイルショーの最後のジョークです。リアリティ番組の嘲笑と寛大なスナキネスの時間は、なじみのある顔を見つけます。

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

画像経由:@pancakeparadox(Twitter)。1997年にポケモンシリーズが初公開されて以来、チームロケット(またはラテンアメリカではチームロケット)として知られる悪役のグループは、何度もアッシュに直面してきました。

今週の科学技術でトランプがめちゃくちゃになったことすべて

今週の科学技術でトランプがめちゃくちゃになったことすべて

画像:ゲッティ私たち全員が千年もの間生きていて、私たちの体が燃える風によってほこりと長引く悲鳴だけに押し流されたと考えるのは驚くべきことです。私たちがそうしていないことを除いて、それはトランプ政権の最初の週の終わりであり、驚くほど多くの恐ろしいことがすでに起こっています。

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

そして今、あることを手に入れていると思っていたが、まったく別のことをしてしまった男の話。CBSニュースは、彼女が「ミニブタ」であるという誤ったふりをしてエスターを養子にしたカナダ人のスティーブジェンキンスの心温まる物語をもたらします。これは、特にせいぜいゴールデンレトリバーまたはセントバーナードをストラップします。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language