如何使用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
是要走的路。 以为我会添加这个小的prettyprint
function:
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 }