2017-03-14 5 views
2

私は標準出力にJSONを出力するgoプログラム(fooと呼ぶ)を書いています。人間が読めるJSON出力を生成できるgolang用のjqラッパーはありますか?

$ ./foo 
{"id":"uuid1","name":"John Smith"}{"id":"uuid2","name":"Jane Smith"} 

読める出力は人間にするために、私は同じようJQにパイプにそれを持っている:

$ ./foo | jq . 

{ 
"id":"uuid1", 
"name": "John Smith" 
} 
{ 
"id":"uuid2" 
"name": "Jane Smith" 
} 

はオープ​​ンソース化されJQラッパーを使用して同じ結果を達成するための方法はありますか?私はいくつか見つけようとしましたが、JSON入力をフィルタリングするための機能をJSON出力をあまり評価しないようにラッピングしています。

+0

これはお探しですか? http://stackoverflow.com/questions/19038598/how-can-i-pretty-print-json-using-go – Vadyus

+0

JSONのレスポンスはバイト配列であり、JSONのスキーマはさまざまです任意に、私は必ずしも不必要なハッキングなしにそれを非整列化することはできません。私はちょうどこの方法でJSONバイト配列を印刷する必要があります。 –

+0

@SiddharthShukla 'json'パッケージもそれをサポートしています:' json.Indent() '。私の編集された答えを見てください。 – icza

答えて

5

encoding/jsonパッケージは、かなりのアウトオブザボックスをサポートしています。 json.MarshalIndent()を使用することができます。または、の場合はEncoder.Encode()に電話する前にEncoder.SetIndent()(new since Go 1.7)メソッドを呼び出してください。

例:

m := map[string]interface{}{"id": "uuid1", "name": "John Smith"} 

data, err := json.MarshalIndent(m, "", " ") 
if err != nil { 
    panic(err) 
} 
fmt.Println(string(data)) 

enc := json.NewEncoder(os.Stdout) 
enc.SetIndent("", " ") 
if err := enc.Encode(m); err != nil { 
    panic(err) 
} 

が出力(Go Playground上でそれを試してみてください):

{ 
    "id": "uuid1", 
    "name": "John Smith" 
} 
{ 
    "id": "uuid1", 
    "name": "John Smith" 
} 

あなただけの "準備" JSONテキストをフォーマットしたい場合は、あなたがjson.Indent()機能を使用することができます

src := `{"id":"uuid1","name":"John Smith"}` 

dst := &bytes.Buffer{} 
if err := json.Indent(dst, []byte(src), "", " "); err != nil { 
    panic(err) 
} 
fmt.Println(dst.String()) 

出力(Go Playgroundで試してください):

{ 
    "id": "uuid1", 
    "name": "John Smith" 
} 

これらindent関数に2 stringパラメータは次のとおり

prefix, indent string 

説明ドキュメントである:

JSONオブジェクトまたは配列の各要素は、新しい、インデントから始まり接頭辞で始まり、インデントネストに従って1つ以上のインデントのコピーが続きます。

したがって、各改行は、入れ子のレベルに応じて、indentの0以上のコピーが続くされる、prefixで開始されるであろう。

あなたは、このようにそれらの値を指定するかどうかははっきりと明らかになった:

json.Indent(dst, []byte(src), "+", "-") 

テストそれを埋め込まれたオブジェクトに:

src := `{"id":"uuid1","name":"John Smith","embedded:":{"fieldx":"y"}}` 

dst := &bytes.Buffer{} 
if err := json.Indent(dst, []byte(src), "+", "-"); err != nil { 
    panic(err) 
} 
fmt.Println(dst.String()) 

出力(Go Playground上でそれを試してみてください):

{ 
+-"id": "uuid1", 
+-"name": "John Smith", 
+-"embedded:": { 
+--"fieldx": "y" 
+-} 
+} 
関連する問題