如何从带反斜杠的字符串中形成漂亮的 JSON?

How can I form a pretty JSON from a string with backslashes?

我有一个Gin-Gonic REST API in Golang。在这里我试图输出已经注册为 JSON 的用户,目前在 Postman 中我只得到:

(您可以忽略 lastRequest-Attribut,因为它目前始终为 nil)

"[{\"id\":\"e61b3ff8-6cdf-4b23-97a5-a28107c57543\",\"firstname\":\"John\",\"lastname\":\"Doe\",\"email\":\"john@doe.com\",\"username\":\"johndoe\",\"token\":\"19b33c79-32cc-4063-9381-f2b64161ad8a\",\"lastRequest\":null},

但我想要这样:

[{
        "id": "e61b3ff8-6cdf-4b23-97a5-a28107c57543",
        "username": "johndoe",
        "email": "john@doe.com",
        "token": "19b33c79-32cc-4063-9381-f2b64161ad8a",
        "lastRequest": null
    }]

我该如何管理它,我用'json.MarshalIndent' (from this Whosebug-post) 尝试了很多东西,但是它对我没有任何改变,我需要做什么?因为无论我做什么,反斜杠都会保留,所以最多插入 \t 或空格。我还读到我必须将它作为一个字节数组来做,但这对我也不起作用(也许我在这里也做错了什么)。

这是我当前的代码:


var users []User
r.GET("/getusers", func(c *gin.Context) {
    usersArr := make([]User, len(users))
    for i := 0; i < len(users); i++ {
        usersArr[i] = users[i]
    }
        
    userJson, err := json.Marshal(testUser)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
    } else {
        c.JSON(200, string(userJson))
    }
})

type User struct {
    Id          string        `json:"id"`
    Firstname   string        `json:"firstname"`
    Lastname    string        `json:"lastname"`
    Email       string        `json:"email"`
    Username    string        `json:"username"`
    Token       string        `json:"token"`
    LastRequest []lastRequest `json:"lastRequest"`
}

两件事:

  1. “反斜杠”只是转义字符。他们实际上并不存在。
  2. 缩进 JSON 调用适当的缩进函数很简单:

如果您已经有了 JSON 字符串,请使用 encoding/json 包中的 json.Indent 函数:

input := []byte("[{\"id\":\"e61b3ff8-6cdf-4b23-97a5-a28107c57543\",\"firstname\":\"John\",\"lastname\":\"Doe\",\"email\":\"john@doe.com\",\"username\":\"johndoe\",\"token\":\"19b33c79-32cc-4063-9381-f2b64161ad8a\",\"lastRequest\":null}]")
buf := &bytes.Buffer{}
if err := json.Indent(buf, input, "", "\t"); err != nil {
    panic(err)
}
fmt.Println(buf.String())

Playground link

但是,如果您试图直接编组为缩进形式,只需使用 Marshal:

MarshalIndent 函数
    userJson, err := json.MarshalIndent(testUser, "", "\t")

好吧,这将是我在 Whosebug 中的第一个答案,希望对您有所帮助。

Go gin 框架带有一些方便的功能,因为我不知道你使用的是什么版本的 golang 和 Gin 框架,你可以试试这个:

var users []User
r.GET("/getusers", func(c *gin.Context) {
    usersArr := make([]User, len(users))
    for i := 0; i < len(users); i++ {
        usersArr[i] = users[i]
    }
        
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
    } else {
        c.JSON(200, users)
// If Indentation is required you could try:
        c.IndentedJSON(200, users)
    }
})

type User struct {
    Id          string        `json:"id"`
    Firstname   string        `json:"firstname"`
    Lastname    string        `json:"lastname"`
    Email       string        `json:"email"`
    Username    string        `json:"username"`
    Token       string        `json:"token"`
    LastRequest []lastRequest `json:"lastRequest"`
}

希望这个功能对您有所帮助。

import (
"encoding/json"
"strings"
)

func logRequest(log *logrus.Entry, data []byte) {
        cp := bytes.NewBuffer([]byte{})
        if err := json.Compact(cp, data); err == nil {
            log.Info("Request received: ", string(cp.Bytes()))
        } else {
            stringifiedData := strings.Replace(string(data[:]), "\n", "", -1)
            stringifiedData = strings.Replace(stringifiedData, "\r\n", "", -1)
            stringifiedData = strings.Replace(stringifiedData, "\t", "", -1)
            log.Info("Request received: ", strings.ReplaceAll(stringifiedData, " ", ""))
        }
    }