package main
import (
"encoding/json"
"fmt"
)
type Data struct {
Id int
Name json.RawMessage
Stt string
}
func main() {
s := `{"aa":"435","rt":23}`
a := Data{
Id: 123,
Name: []byte(s),
Stt: `ewr""\`,
}
marshal, err := json.Marshal(a)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(marshal))
}
运行结果
{"Id":123,"Name":{"aa":"435","rt":23},"Stt":"ewr\"\"\\"}
json序列化由于escapeHTML: true ,会保留转义字符。
json.Marshal 源码
func Marshal(v any) ([]byte, error) {
e := newEncodeState()
err := e.marshal(v, encOpts{escapeHTML: true})
if err != nil {
return nil, err
}
buf := append([]byte(nil), e.Bytes()...)
encodeStatePool.Put(e)
return buf, nil
}
所以Stt内容会带有\"。如果不想带有\"之类的符号,
则需要使用json.RawMessage类型,RawMessage.Marshal会原封不动保留值,所以不会有转义字符。
备注:RawMessage值要求符合json格式才行;非json格式值会err。