- 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。