web-dev-qa-db-ja.com

シェルスクリプトでJSONをきれいに印刷するにはどうすればよいですか。

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

基本的に、私はそれが次のように変換して欲しいです

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

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

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

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"}'のように起動します。

3958
B Bycroft

あなたは使用することができます: jq

使い方はとても簡単で、とても効果的です。ストリームを含む非常に大きなJSON構造を処理できます。あなたは彼らのチュートリアルを見つけることができます ここ

これが一例です。

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

または言い換えれば:

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

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));\
 });\
"
366
Somu

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

アンダースコア - cli

これが「スマートホワイトスペース」のようなものです。

少し偏っているかもしれませんが、コマンドラインから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

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

326
Dave Dopson

私はいつもやるだけです:

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
171
locojay

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

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

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

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の "Extension System"を表しているものです)。

68
knb

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

67
Daryl Spitzer

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

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

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

64
Paul Horsfall
63
Olexandr Minzak

_ 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のどこかにコピーするだけです。

53
jordelver

pjson を試してください。色があります!

echo '{"json":"obj"} | pjson

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

⚡ pip install pjson

そして、JSONコンテンツをpjsonにパイプします。

$ 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"
}
43
jfs

それが私のやり方です。

curl yourUri | json_pp

それはコードを短くし、仕事をやり遂げます。

42
JedatKinports

私は jshon を使用して、記述していることを正確に実行します。とにかく走れ:

echo $COMPACTED_JSON_TEXT | jshon

JSONデータを変換するために引数を渡すこともできます。

39
yardena

Jazor をチェックしてください。これはRubyで書かれたシンプルなコマンドラインのJSONパーサです。

gem install jazor
jazor --help
37
Mike

または、Rubyの場合:

echo '{ "foo": "lorem", "bar": "ipsum" }' | Ruby -r json -e 'jj JSON.parse gets'
37
darscan

出力を単純にjq .に渡します。

例:

twurl -H ads-api.Twitter.com '.......' | jq .
29
Ackshaey Singh

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
28
Salman A

色素沈着

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

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

my this answer にリストされているpygmentizeに代わるものがいくつかあります。

ライブデモは次のとおりです。

Demo

24

バニラバッシュ

きれいな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)ファイルからファイルへのWindows GIT Bash(UTF8ベース)で使用します。

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json
23
Evgeny Karpov

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にプレインストールされていることは言及に値する

19
Philip Durbin

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
18
htaccess
  1. brew install jq
  2. command + | jq 
  3. (例:curl localhost:5000/blocks | jq
  4. 楽しい!

enter image description here

15

jj は超高速で、巨大なJSON文書を経済的に扱うことができ、有効なJSON番号を台無しにせず、使いやすいです。 

jj -p # for reading from STDIN

または

jj -p -i input.json

それは(2018)まだかなり新しいので、多分それはあなたが期待するように無効なJSONを処理しないでしょう、しかしそれは主要なプラットフォームにインストールするのは簡単です。

14
peak

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

Sudo apt-get install yajl-tools

それから、

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

11

私の経験では yajl はとてもいいです。 json_reformatに次の行を追加することで、.jsonコマンドを使用してvim内の.vimrcファイルをきれいに印刷します。

autocmd FileType json setlocal equalprg=json_reformat
10
Hank Gay

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
9
svidgen

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

Enter image description here

8
fangxing

batは、構文の強調表示付きのcatクローンです。 https://github.com/sharkdp/bat

例:

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

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

それはjsonのためのカラーリングとフォーマットを持っていて、notこのコメントで述べられている問題を持っていません: どうやったらシェルスクリプトでJSONをきれいに印刷できますか?

8
Grav

私は使っています 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
 }
8
slashmili

私はこの質問に対する答えが吐き気であることを知っていますが、私は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";'
7
pimlottc
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

あなたは結果を達成するためにこの簡単なコマンドを使うことができます。

7
Arpit Rathod
$ Sudo apt-get install edit-json
$ prettify_json myfile.json
6
Bryan Larsen

これは 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
5
numan salati

TidyJSON があります。

C#なので、 Mono でコンパイルして* nixで作業することもできます。保証はありません、すみません。

5
Robert Gould

ツール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にこのツールが含まれています。あるいは、yojson_ opam _ を介してインストールすることができます。

5
josch

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}))}}))"
4
adius

私は 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
3
Wu Yongzheng

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

3
Nikhil Ranjan

JavaScript/NodeJSの場合: vkBeautify.jsプラグイン を見てください。これはJSONとXMLの両方のテキストをきれいに印刷します。

それは普通のJavaScriptで書かれていて、1.5KB(縮小)以下でとても速いです。

3
vadimk

これがGroovyのワンライナーです。

echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
2
Orest Ivasiv

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))
2
Aidan Melen
2
lev

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 ))"
1
harish2704

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

サードパーティ製のツールを使用しても構わない場合は、 jsonprettyprint.org にアクセスしてください。これはマシンにパッケージをインストールできない場合のためです。

curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'
0
Yada
0
chronos

私の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/ に導いた。私はこの一つのパーサが他の多くのものよりはるかにフォールトトレラントであると思います。 

0
nelaaro

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"
}
0
Reino