シェルスクリプトで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

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

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

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

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

Total War:Warhammer:Kotakuレビュー

Total War:Warhammer:Kotakuレビュー

私はこのゲームを嫌う準備ができていました。先週の前に、Total War:Warhammerについての私の考えがありました:それでもここに私は、私の手にある完成品であり、私は変わった男です。

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

スタンディングロックスー族のメンバーと水の保護者は、ノースダコタ州のスタンディングロックにあるオセティサコウィンキャンプを去ります。(Twitter経由のCNNスクリーンショット)火と煙がスカイラインを覆い、スタンディングロックスー族のメンバーと水の保護者が、聖なるものを守りながら建てた家、オセティサコウィン(セブンカウンシルファイアーズ)キャンプから行進し、太鼓を打ち、歌い、祈りました。ダコタアクセスパイプラインとしても知られる「ブラックスネーク」からの土地。

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

写真:APシアーズとKマートは、イヴァンカ・トランプのトランプホームアイテムのコレクションも、誰も購入したくないために削除しました。シアーズとKマートの両方の親会社であるシアーズホールディングスは、土曜日のABCニュースへの声明で、彼らが気にかけていると辛抱強く説明しましたトランプラインを売り続けるにはお金を稼ぐことについてあまりにも多く。

ポテトチップスでたった10分でスペインのトルティーヤを作る

ポテトチップスでたった10分でスペインのトルティーヤを作る

伝統的なスペインのトルティーヤは通常、オリーブオイルで柔らかくなるまで調理されたポテトから始まります(30分以上かかる場合があります)が、ケトルで調理されたポテトチップスの助けを借りてわずか10分でテーブルに置くことができます。上のビデオはすべてがバラバラにならないように裏返す方法を含め、レシピ全体を説明しますが、必要なのは4〜5個の卵と3カップのケトルチップスだけです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language