web-dev-qa-db-ja.com

JSON文字列をきれいにするCLIツールはありますか

私のホストでは、次のように入力します。これにより、CLIでは読みにくい一連の情報が返されます。

echo $ENV_VAR | base64 --decode

それをフォーマットする方法はありますか?

これはコマンドの出力例です。

{"something":[{"path": "something"、 "Host": "something.internal"、 "scheme": "solr"、 "port":8080、 "ip": "123.4.567.89"}] 、 "second_database":[{"username": "user"、 "password": ""、 "ip": "123.4.567.89"、 "Host": "second_database.internal"、 "query":{"is_master" :true}、 "path": "main"、 "scheme": "mysql"、 "port":3306}]、 "redis":[{"ip": "123.4.567.89"、 "Host": "redis "、" scheme ":" redis "、" port ":6379}]、" database ":[{" username ":" user "、" password ":" "、" ip ":" 123.4.567.89 "、" Host ":" database.internal "、" query ":{" is_master ":true}、" path ":" main "、" scheme ":" mysql "、" port ":3306}]}

私のホストは、多くの場合と同様に、読み取り専用のファイルシステムを提供していることを指摘する価値があるでしょう。

5
crmpicco
cat file.json | json_pp  #Perl utility
cat file.json | jq .    

jq きれいに印刷できる能力以上のものが詰まっています。

14
PSkocik

私はそれをyamlにパイプします(これは ruamel.yaml の一部ですが、私はその著者です):

echo $ENV_VAR | base64 --decode | yaml from-json -

これは(あなたの出力例に基づいて)あなたに与えます:

second_database:
- username: user
  password: ''
  ip: 123.4.567.89
  Host: second_database.internal
  path: main
  query:
    is_master: true
  scheme: mysql
  port: 3306
redis:
- ip: 123.4.567.89
  Host: redis
  scheme: redis
  port: 6379
something:
- path: something
  Host: something.internal
  scheme: solr
  port: 8080
  ip: 123.4.567.89
database:
- username: user
  password: ''
  ip: 123.4.567.89
  Host: database.internal
  path: main
  query:
    is_master: true
  scheme: mysql
  port: 3306

キーの順序は保証されていません。jsonでは保証されておらず、jsonで読み取るときに順序を保持するruamel.jsonのようなruamel.yamlパッケージがないためです。

上記は、YAMLがJSONのスーパーセットであるという原則に基づいて機能しますが、より読みやすい表示モードがあります(絶対に必要でない場合は引用符を省略し、インデントされたブロック構造にします)。

2
Anthon

OK、その出力はJSONです。 JSONとして解析する:

#!/usr/bin/Perl;
use strict;
use warnings;

use JSON;

local $/; 
print to_json ( decode_json ( <> ), {pretty => 1 });

次のように印刷します。

{
   "something" : [
      {
         "Host" : "something.internal",
         "scheme" : "solr",
         "ip" : "123.4.567.89",
         "path" : "something",
         "port" : 8080
      }
   ],
   "second_database" : [
      {
         "path" : "main",
         "ip" : "123.4.567.89",
         "query" : {
            "is_master" : true
         },
         "Host" : "second_database.internal",
         "port" : 3306,
         "password" : "",
         "scheme" : "mysql",
         "username" : "user"
      }
   ],
   "redis" : [
      {
         "scheme" : "redis",
         "ip" : "123.4.567.89",
         "port" : 6379,
         "Host" : "redis"
      }
   ],
   "database" : [
      {
         "username" : "user",
         "password" : "",
         "scheme" : "mysql",
         "port" : 3306,
         "Host" : "database.internal",
         "ip" : "123.4.567.89",
         "query" : {
            "is_master" : true
         },
         "path" : "main"
      }
   ]
}

フォーマット済み、ボーナスポイント-まだJSON。

1
Sobrique

echo $ENV_VAR | base64 --decode | json_reformatをお試しください。これが6.x以降のCentosバージョンである場合は、

1
csny

次のnpmjsパッケージがタスクを実行します: https://www.npmjs.com/package/js-beautify

あなたはそれをインストールすることができます

npm -g install js-beautify

グローバルに、ただしdebianパッケージを上書きするのは基本的な練習です。独自のグローバルパッケージセットまたはローカルパッケージセットを作成し、そこからツールを使用する方がよいでしょう。

そのためにはnodejsが必要です。