为什么在 golang 中解组转义的 JSON 字符串需要四个 '\'?

问题描述 投票:0回答:0

我的代码:

我想解组一个包含正则表达式语法的字符串,所以有

\d \w \( 
.... . Json 解组失败!其实我发现需要四个
\
before escapse chars,我不想用
strings.ReplaceAll(str, "\\", "\\\\")
,怎么办?

package main

import (
        "encoding/json"
        "fmt"
        "strconv"
)

func main() {
        var original = "{\"photo\":\"abc\\w\"}"   // \\w will err, but \\\\w will work

        fmt.Println("src msg: ", original)
        un, err := strconv.Unquote(original)
        fmt.Println(err, un)

        fmt.Println("unmarshal bytes")
        msg := struct {
                Photo string
        }{}

        err = json.Unmarshal([]byte(original), &msg)
        fmt.Println("Unmarshal res: ", err, msg.Photo)

}

结果:

src msg:  {"photo":"abc\w"}
invalid syntax 
unmarshal bytes
Unmarshal res:  invalid character 'w' in string escape code 

解决

  • 如果把
    \\w
    换成
    \\n
    也可以!
  • 如果加四个
    \
    ===>
    {\"photo\":\"abc\\\\w\"}  

var original = "{\"photo\":\"abc\\\\w \\n\"}"
结果还可以!

src msg:  {"photo":"abc\\w \n"}
invalid syntax 
unmarshal bytes
Unmarshal res:  <nil> abc\w 

如何理解这个案例?以及如果包含

\\w
但不包含
\\\\w
,如何解组字符串?

(操场链接:https://go.dev/play/p/2MibQN71Ldw

json go unmarshalling
© www.soinside.com 2019 - 2024. All rights reserved.