🗃️在Go中漂亮打印JSON的3种方法

4,261 阅读1分钟

在日常编程工作中(尤其是作为一个网络开发人员),你经常需要调试和分析JSON响应。在这种情况下,为了提高可读性,用适当的缩进显示它们是很好的,这通常被称为漂亮打印或美化JSON。在Go中,我们可以通过几种方式使用 encoding/json包。

通过编码值进行JSON漂亮的打印

函数 json.MarshalIndent生成带缩进的JSON编码的值。你可以指定每个JSON行的prefix ,并根据缩进程度,indent ,复制一次或多次。在我们的例子中,我们使用四个空格的缩进来漂亮地打印JSON。

package main
import (
"encoding/json"
"fmt"
"log"
)
func PrettyStruct(data interface{}) (string, error) {
val, err := json.MarshalIndent(data, "", " ")
if err != nil {
return "", err
}
return string(val), nil
}
type Fruit struct {
Name string `json:"name"`
Color string `json:"color"`
}
func main() {
fruit := Fruit{
Name: "Strawberry",
Color: "red",
}
res, err := PrettyStruct(fruit)
if err != nil {
log.Fatal(err)
}
fmt.Println(res)
}

通过编码值漂亮地打印JSON

如果你使用 json.Encode,你可以通过 Encoder.SetIndent方法设置缩进,就像在marshaling中一样,通过定义一个prefixindent

package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
)
func PrettyEncode(data interface{}, out io.Writer) error {
enc := json.NewEncoder(out)
enc.SetIndent("", " ")
if err := enc.Encode(data); err != nil {
return err
}
return nil
}
type Fruit struct {
Name string `json:"name"`
Color string `json:"color"`
}
func main() {
fruit := Fruit{
Name: "Strawberry",
Color: "red",
}
var buffer bytes.Buffer
err := PrettyEncode(fruit, &buffer)
if err != nil {
log.Fatal(err)
}
fmt.Println(buffer.String())
}

漂亮地打印JSON字符串

encoding/json也有一个有用的函数 json.Indent来美化没有缩进的JSON字符串为有缩进的JSON。该函数需要源JSON,输出缓冲区,prefix ,和indent

package main
import (
"bytes"
"encoding/json"
"fmt"
"log"
)
func PrettyString(str string) (string, error) {
var prettyJSON bytes.Buffer
if err := json.Indent(&prettyJSON, []byte(str), "", " "); err != nil {
return "", err
}
return prettyJSON.String(), nil
}
func main() {
fruitJSON := `{"name": "Strawberry", "color": "red"}`
res, err := PrettyString(fruitJSON)
if err != nil {
log.Fatal(err)
}
fmt.Println(res)
}

所有的方法都以缩进的方式打印JSON字符串。

{
"name": "Strawberry",
"color": "red"
}