如何使用Go漂亮地打印JSON?

有没有人知道一个简单的方法来打印JSON输出?

股票http://golang.org/pkg/encoding/json/包似乎并没有包括这个function (编辑:它,看到接受的答案),并迅速谷歌没有什么明显的东西。

我正在寻找的使用都是漂亮的 – 打印json.Marshal的结果,只是从任何地方格式化JSONstring,所以更容易阅读debugging目的。

通过漂亮的印刷,我认为你的意思是缩进,像这样

 { "data": 1234 } 

而不是

 {"data":1234} 

最简单的方法是使用MarshalIndent ,它可以让你指定如何通过indent参数indent 。 因此, json.MarshalIndent(data, "", " ")将使用四个空格进行缩进。

接受的答案是非常好的,如果你有一个对象,你想变成JSON。 这个问题还提到漂亮的打印任何JSONstring,这就是我正在尝试做的。 我只是想从POST请求(特别是CSP违规报告 )漂亮地logging一些JSON。

要使用MarshalIndent ,你必须将它Unmarshal组成一个对象。 如果你需要的话,去做吧,但我没有。 如果你只需要漂亮地打印一个字节数组,简单的Indent是你的朋友。

以下是我最后的结果:

 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())) } 

为了更好的内存使用,我想这是更好的:

 var out io.Writer enc := json.NewEncoder(out) enc.SetIndent("", " ") err := enc.Encode(data) if err := nil { panic(err) } 

编辑回想一下,这是非惯用的Go。 像这样的小帮手function增加了一个额外的复杂步骤。 一般来说,Go哲学倾向于将3条简单线条包含在1条棘手的线条中。


正如@robyoder所提到的, json.Indent是要走的路。 以为我会添加这个小的prettyprintfunction:

 package main import ( "bytes" "encoding/json" "fmt" ) //dont do this, see above edit func prettyprint(b []byte) ([]byte, error) { var out bytes.Buffer err := json.Indent(&out, b, "", " ") return out.Bytes(), err } func main() { b := []byte(`{"hello": "123"}`) b, _ = prettyprint(b) fmt.Printf("%s", b) } 

https://go-sandbox.com/#/R4LWpkkHIN或http://play.golang.org/p/R4LWpkkHIN

这是我使用的。 如果打印JSON失败,它只会返回原始string。 用于打印应该包含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() } 

这是我的解决scheme :

 import ( "bytes" "encoding/json" ) const ( empty = "" tab = "\t" ) func PrettyJson(data interface{}) (string, error) { buffer := new(bytes.Buffer) encoder := json.NewEncoder(buffer) encoder.SetIndent(empty, tab) err := encoder.Encode(data) if err != nil { return empty, err } return buffer.String(), nil }