3414

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

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

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

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

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

59 に答える 59

4899

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

于 2009-12-17T09:48:55.990 に答える
1314

以下を使用できます。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"
于 2013-03-05T18:34:05.913 に答える
401

の「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));\
 });\
"
于 2010-07-12T13:00:30.177 に答える
350

利用可能な最高の「スマート空白」フォーマッタの 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

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

于 2012-05-01T16:48:57.497 に答える
181

私は通常ただします:

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
于 2011-11-01T01:19:25.847 に答える
94

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))
于 2008-12-09T22:22:59.883 に答える
93

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

curl -s http://search.twitter.com/search.json?q=node.js | json
于 2011-01-30T00:46:17.487 に答える
89

jqツールを使ったネイティブなやり方で簡単すぎません。

例えば:

cat xxx | jq .
于 2017-05-18T15:47:04.327 に答える
74

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」は「pureperl」を表します。ツールはPerlでのみ実装され、外部Cライブラリ(XSの略であるPerlの「拡張システム」)にバインドされません。

于 2010-06-30T14:31:12.037 に答える
73

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

于 2009-07-31T00:51:48.403 に答える
67

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

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

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

于 2009-12-29T16:36:35.643 に答える
62
$ 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"
}
于 2008-12-09T08:52:28.740 に答える
59

更新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. そうでない場合は、単にバイナリを .xml のどこかにコピーできます$PATH

于 2013-05-21T09:18:49.850 に答える
53

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

エコー '{

次を使用してインストールしますpip

⚡ pip install pjson

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

于 2013-01-29T12:23:49.733 に答える
40

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

echo $COMPACTED_JSON_TEXT | jshon

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

于 2011-05-19T23:51:40.040 に答える
40

または、Ruby の場合:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
于 2009-10-21T09:10:49.650 に答える
37

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

gem install jazor
jazor --help
于 2011-01-25T18:35:20.103 に答える
31

JSONLintには、コマンド ラインで使用したり、Node.js プロジェクトに含めたりできるオープンソースの実装が GitHubにあります。

npm install jsonlint -g

その後

jsonlint -p myfile.json

また

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
于 2012-04-27T10:37:19.523 に答える
30

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

例:

twurl -H ads-api.twitter.com '.......' | jq .
于 2016-10-03T23:29:30.433 に答える
25

色素沈着

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

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

私のこの回答にリストされているpygmentizeの代替手段がいくつかあります。

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

デモ

于 2015-08-27T10:09:30.537 に答える
25

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

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

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

于 2011-10-07T18:27:26.903 に答える
20

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
于 2011-02-02T22:06:53.730 に答える
20

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

jj -p # for reading from STDIN

また

jj -p -i input.json

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

于 2018-02-25T13:50:32.133 に答える
16

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

sudo apt-get install yajl-tools

それから、

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
于 2012-11-23T13:30:17.317 に答える
13

Ruby を 1 行で使用する:

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

ここに画像の説明を入力してください

于 2017-10-27T06:41:27.887 に答える
10

これは、Json の prettify コマンドよりも優れた Ruby ソリューションです。宝石colorful_jsonはかなり良いです。

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}
于 2013-08-06T10:14:25.007 に答える
10

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

autocmd FileType json setlocal equalprg=json_reformat
于 2011-05-18T16:32:44.977 に答える
8

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
 }
于 2015-03-06T02:48:18.247 に答える
8

JF Sebastian のソリューションは、Ubuntu 8.04 ではうまくいきませんでした。
これは、古い 1.X JSON ライブラリで動作する変更された Perl バージョンです。

perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
于 2009-06-29T21:01:46.500 に答える
7

TidyJSONがあります。

これはC#なので、 Monoでコンパイルして、*nixで作業できるかもしれません。保証はありませんが、申し訳ありません。

于 2008-12-09T08:31:36.910 に答える
7

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}))}}))"
于 2015-11-14T09:58:12.333 に答える
6

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

于 2016-07-31T16:28:12.720 に答える
5
$ sudo apt-get install edit-json
$ prettify_json myfile.json
于 2011-02-15T16:33:52.457 に答える
4

これをGroovyスクリプトで行う方法を次に示します。

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
于 2011-12-08T21:35:43.740 に答える
4

私はこの解決策を思いつきました: https://calbertts.medium.com/unix-pipelines-with-curl-requests-and-serverless-functions-e21117ae4c65

# this in your bash profile
jsonprettify() {
  curl -Ss -X POST -H "Content-Type: text/plain" --data-binary @- https://jsonprettify.vercel.app/api/server?indent=$@
}
echo '{"prop": true, "key": [1,2]}' | jsonprettify 4
# {
#     "prop": true,
#     "key": [
#         1,
#         2
#     ]
# }

何もインストールする必要はありません。インターネット接続と cURL がインストールされていれば、この機能を使用できます。

何もインストールできない別のホストにいる場合、これはその問題の完璧な解決策です。

于 2021-01-04T09:29:21.530 に答える
3

私は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
于 2012-01-11T04:00:57.823 に答える
3
gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty

このメソッドは、HTTP 応答/ヘッダーを検出し、それらをそのまま出力し、本文にスキップします (`curl -i' で使用するため) .

于 2015-12-11T11:05:45.870 に答える
3

Groovy のワンライナーを次に示します。

echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
于 2014-08-12T21:12:51.577 に答える
3

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

これはプレーンな JavaScript で書かれており、1.5 KB (縮小) 未満で、非常に高速です。

于 2012-01-25T20:33:41.943 に答える
1

私の JSON ファイルは、これらの方法のいずれによっても解析されませんでした。

私の問題は投稿に似ていましたGoogle データソース JSON は無効ですか? .

その投稿への回答は、解決策を見つけるのに役立ちました。

文字列キーがない無効な 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/にたどり着きました。この 1 つのパーサーは、他の多くのパーサーよりもはるかにフォールト トレラントであると思います。

于 2012-03-07T10:41:28.920 に答える
0

コンソールで json ログを視覚化する場合は、 munia-pretty-jsonを使用できます

npm install -g munia-pretty-json

json データ (app-log.json)

{"time":"2021-06-09T02:50:22Z","level":"info","message":"Log for pretty JSON","module":"init","hostip":"192.168.0.138","pid":123}
{"time":"2021-06-09T03:27:43Z","level":"warn","message":"Here is warning message","module":"send-message","hostip":"192.168.0.138","pid":123}

次のコマンドを実行します。

munia-pretty-json app-log.json

コンソールで読み取り可能な出力は次のとおりです。

ここに画像の説明を入力

テンプレートを使用して出力をフォーマットできます。デフォルトのテンプレートは'{time} {level -c} {message}'

テンプレートの使用:

munia-pretty-json -t '{module -c} - {level} - {message}' app-log.json

出力:

ここに画像の説明を入力

于 2022-01-25T12:34:05.643 に答える
-2

必要に応じて、代わりにオンライン ツールを使用することもできます。

http://jsonprettyprint.netが最もシンプルで簡単だと思います。

于 2014-11-19T17:03:56.227 に答える
-3

元の投稿がシェル スクリプトを要求したことは知っていますが、有用で無関係な回答が非常に多く、おそらく元の作成者には役立たなかったでしょう。無関係に追加:)

ところで、コマンド ライン ツールを動作させることができませんでした。

シンプルな JSON JavaScript コードが必要な場合は、次のようにします。

JSON.stringfy(JSON.parse(str), null, 4)

http://www.geospaces.org/geoweb/Wiki.jsp?page=JSON%20Utilities%20デモ

JSON をきれいにするだけでなく、属性または属性とレベルで並べ替える JavaScript コードを次に示します。

入力が

{ "c": 1, "a": {"b1": 2, "a1":1 }, "b": 1},

次のいずれかを出力します (すべてのオブジェクトをまとめてグループ化します)。

{
     "b": 1,
     "c": 1,
     "a": {
          "a1": 1,
          "b1": 2
     }
}

または (キーによる注文のみ):

{
 "a": {
      "a1": 1,
      "b1": 2
 },
 "b": 1,
 "c": 1
}
于 2012-11-16T10:24:15.943 に答える