配列 - (Unix)シェルスクリプトでJSONをきれいに印刷するにはどうすればいいですか?




シェルスクリプト json 配列 (20)

人間が読める形式でJSONを書式設定するための(Unix)シェルスクリプトはありますか?

基本的には、次のように変換してほしい。

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

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

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

Pygmentize

私はPythonのjson.toolとpygmentizeを組み合わせます:

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

私の答えに列挙されているいくつかの選択肢があります 。

ここにライブデモがあります:


バニラ・バシ

サードパーティのインストールをしない、かなりの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}'

例:

1)コンソールでファイルを読み込んできれいに印刷する

cat file.json | json_pretty.sh

2)ファイルからファイルへのウィンドウGIT Bashを使用する(UTF8ベース):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json

* 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それを入れてください。


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))

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

Perlでは、CPANからJSON::PPをインストールすると、 json_ppコマンドが実行されます。 exampleをB Bycroftから盗み取れば、あなたは次のようになる:

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

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


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"}'ように呼び出します。


npmとNode.jsを使用する場合は、 npm install -g jsonnpm install -g jsonて、 json介してコマンドをパイプnpm install -g jsonことができます。 json -hを実行してすべてのオプションを取得します。 また、特定のフィールドを取り出し、 -i使って出力をカラー化することもでき-i

curl -s http://search.twitter.com/search.json?q=node.js | json

JSONLintgithub上のオープンソース実装があり、コマンドラインで使用することも、node.jsプロジェクトに組み込むこともできます。

npm install jsonlint -g

その後

jsonlint -p myfile.json

または

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less

yajlは私の経験ではとてもいいです。 私はjson_reformatコマンドを使って.vimrcファイルに次の行を入れてvim .jsonファイルをきれいに印刷します:

autocmd FileType json setlocal equalprg=json_reformat

JazorチェックしてJazor 。 Rubyで書かれたシンプルなコマンドラインJSONパーサです。

gem install jazor
jazor --help

jjは超高速で、巨大なJSON文書を経済的に処理でき、有効なJSON番号を混乱させず、使いやすいです。

jj -p # for reading from STDIN

または

jj -p -i input.json

それはまだかなり新しいので(2018)、おそらく無効なJSONを期待通りに処理できないかもしれませんが、主要なプラットフォームにインストールするのは簡単です。


更新私は別の答えに示唆されているように今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 jsonppbrew install jsonppます。 もしそうでなければ、 $PATHどこかにバイナリをコピーするだけです。


それが私のやり方です:

curl yourUri | json_pp

それはコードを短縮し、仕事を終わらせる。


以下のコマンドでyajl-toolsをインストールしてください:

sudo apt-get install yajl-tools

次に、

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


以下を使用できます: jq

それは非常に使いやすく、素晴らしいです! ストリームを含む非常に大きなJSON構造を処理できます。 hereそのチュートリアルを見つけることができます。

次に例を示します。

$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

つまり、言い換えれば:

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

私はjshonを使って、あなたが描いていることを正確に行います。 とにかく走れ:

echo $COMPACTED_JSON_TEXT | jshon

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


私はhttpieを使用してい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
 }

私はたいてい次のようにします:

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

認証トークンを使用して、コマンドラインですべてを1つにcurlたい場合は、次のようにします。

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

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

underscore-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

このツールは私の現在の情熱プロジェクトです。機能リクエストがある場合は、それらに対処するチャンスがあります。





pretty-print