GoでJSON出力をきれいに印刷する簡単な方法を知っている人はいますか?
ストックhttp://golang.org/pkg/encoding/json/パッケージには、このための機能が含まれていないようです(編集: 含まれています。受け入れられた回答を参照してください)。
私が探している用途は、結果をきれいに印刷することとjson.Marshal
、どこからでも JSON でいっぱいの文字列をフォーマットすることの両方であるため、デバッグ目的で読みやすくなります。
GoでJSON出力をきれいに印刷する簡単な方法を知っている人はいますか?
ストックhttp://golang.org/pkg/encoding/json/パッケージには、このための機能が含まれていないようです(編集: 含まれています。受け入れられた回答を参照してください)。
私が探している用途は、結果をきれいに印刷することとjson.Marshal
、どこからでも JSON でいっぱいの文字列をフォーマットすることの両方であるため、デバッグ目的で読みやすくなります。
きれいな印刷とは、インデントされていることを意味すると思います
{
"data": 1234
}
それよりも
{"data":1234}
これを行う最も簡単な方法は を使用することです。これにより、引数MarshalIndent
を介してインデント方法を指定できます。indent
したがって、json.MarshalIndent(data, "", " ")
インデントに 4 つのスペースを使用してプリティプリントします。
JSONに変換したいオブジェクトがある場合、受け入れられた答えは素晴らしいです。この質問では、任意の JSON 文字列だけをきれいに印刷することについても言及しています。それが私がやろうとしていたことです。POST リクエスト (具体的にはCSP 違反レポート)から JSON をきれいにログに記録したかっただけです。
を使用するMarshalIndent
には、Unmarshal
それをオブジェクトにする必要があります。あなたがそれを必要とするなら、それを求めてください、しかし私はしませんでした. バイト配列をきれいに印刷する必要がある場合Indent
は、plain が最適です。
これが私が最終的に得たものです:
import (
"bytes"
"encoding/json"
"log"
"net/http"
)
func HandleCSPViolationRequest(w http.ResponseWriter, req *http.Request) {
body := App.MustReadBody(req, w)
if body == nil {
return
}
var prettyJSON bytes.Buffer
error := json.Indent(&prettyJSON, body, "", "\t")
if error != nil {
log.Println("JSON parse error: ", error)
App.BadRequest(w)
return
}
log.Println("CSP Violation:", string(prettyJSON.Bytes()))
}
これが私が使用するものです。JSON の整形に失敗すると、元の文字列が返されます。JSON を含む必要がある HTTP 応答を出力するのに役立ちます。
import (
"encoding/json"
"bytes"
)
func jsonPrettyPrint(in string) string {
var out bytes.Buffer
err := json.Indent(&out, []byte(in), "", "\t")
if err != nil {
return in
}
return out.String()
}
私は行くのが初めてですが、これは私がこれまでに集めたものです:
package srf
import (
"bytes"
"encoding/json"
"os"
)
func WriteDataToFileAsJSON(data interface{}, filedir string) (int, error) {
//write data as buffer to json encoder
buffer := new(bytes.Buffer)
encoder := json.NewEncoder(buffer)
encoder.SetIndent("", "\t")
err := encoder.Encode(data)
if err != nil {
return 0, err
}
file, err := os.OpenFile(filedir, os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
return 0, err
}
n, err := file.Write(buffer.Bytes())
if err != nil {
return 0, err
}
return n, nil
}
これは関数の実行であり、単なる標準です
b, _ := json.MarshalIndent(SomeType, "", "\t")
コード:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
minerals "./minerals"
srf "./srf"
)
func main() {
//array of Test struct
var SomeType [10]minerals.Test
//Create 10 units of some random data to write
for a := 0; a < 10; a++ {
SomeType[a] = minerals.Test{
Name: "Rand",
Id: 123,
A: "desc",
Num: 999,
Link: "somelink",
People: []string{"John Doe", "Aby Daby"},
}
}
//writes aditional data to existing file, or creates a new file
n, err := srf.WriteDataToFileAsJSON(SomeType, "test2.json")
if err != nil {
log.Fatal(err)
}
fmt.Println("srf printed ", n, " bytes to ", "test2.json")
//overrides previous file
b, _ := json.MarshalIndent(SomeType, "", "\t")
ioutil.WriteFile("test.json", b, 0644)
}