我有一些字符串想要转换为 JSON。这里使用encoding/json,没有尝试过其他包。
如果按原样保存,字符串可能包含换行符和其他会破坏 JSON 的内容。
如果我传递一个字符串文字,它就会起作用 - 它会在反斜杠前面添加反斜杠。如果我只传递一个常规字符串,它就不起作用。我似乎无法弄清楚是否有办法使用包含字符串文字的变量。
编辑:正如所指出的,这些不是相同的值,我有点理解这一点,但这并不能帮助我解决我的问题。
示例代码:
package main
import (
"fmt"
"encoding/json"
)
func main() {
type Test struct {
Input string
}
regularString := Test{"asd\nqwe"}
out, err := json.Marshal(regularString)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(out))
literalString := Test{`asd\nqwe`}
out, err = json.Marshal(literalString )
if err != nil {
fmt.Println(err)
}
fmt.Println(string(out))
}
最佳答案
encoding/json
正确编码所有字符串值。
您的第一个示例按照您的预期工作,因为您使用解释的字符串文字,如果它包含 \n
序列,编译器会将其替换为换行符性格。
您的第二个示例无法按您的预期工作,因为您使用了原始字符串文字,如果它包含 \n
序列,则不会被替换,但这两个字符将保留在字符串中。这将被 encoding/json
正确转义,以保留在 JSON 输出中。
所以基本上
"asd\nqwe"`
和
`asd\nqwe`
是2个不同的字符串,它们不相等,因此它们的JSON转义值也不同。
检查Spec: String literals了解更多详情。
请注意,如果要使用原始字符串文字创建字符串值,则不能在其中使用转义序列。要在原始字符串文字中添加换行符,只需换行即可,如下所示:
s := `asd
qwe`
另一种选择是“破坏”字符串文字,并使用解释的字符串文字插入换行符(并连接各部分):
s := `asd` + "\n" + `qwe`
关于json - 如何在 GO 中将换行符转换为正确的 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53295953/