欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

go語言json轉換轉義符

林國瑞2年前8瀏覽0評論

在使用go語言處理json格式數(shù)據(jù)時,有時會遇到一些需要進行轉義的字符,例如雙引號、反斜杠等。這時候我們就需要用到json包中的一些函數(shù)來進行轉義,主要有以下兩種:

//將字符串 s 進行轉義,并將結果寫入w中
func (e *encodeState) string(s string) {
e.WriteByte('"')
start := 0
for i := 0; i< len(s); i++ {
if ch := s[i]; ch< utf8.RuneSelf {
if ascii[ch] {
continue
}
if start< i {
e.WriteString(s[start:i])
}
switch ch {
case '\\', '"':
e.WriteByte('\\')
e.WriteByte(ch)
case '\n':
e.WriteByte('\\')
e.WriteByte('n')
case '\r':
e.WriteByte('\\')
e.WriteByte('r')
case '\t':
e.WriteByte('\\')
e.WriteByte('t')
default:
if ch< ' ' {
e.WriteString(`\u00`)
e.WriteByte(hex[ch>>4])
e.WriteByte(hex[ch&0xF])
} else {
e.WriteByte(ch)
}
}
start = i + 1
}
}
if start != len(s) {
e.WriteString(s[start:])
}
e.WriteByte('"')
}
//將 b 中的json字符串解析,并將結果寫入v中
func Unmarshal(data []byte, v interface{}) error {
d := new(decodeState)
err := d.unmarshal(data, v)
if err != nil {
return err
}
if d.off< len(data) {
return &SyntaxError{msg: "trailing garbage", offset: int64(d.off)}
}
return nil
}

第一個函數(shù)是將字符串進行轉義,主要包括以下的轉義字符:

  • 雙引號:\"
  • 反斜杠:\\
  • 回車符:\r
  • 換行符:\n
  • 制表符:\t

如果字符串中包含其他需要轉義的字符,將會使用\u00xx形式進行轉義。

第二個函數(shù)是將json字符串進行解析,結果寫入到v中,v可以是一個結構體,也可以是其他類型。在解析過程中,會自動對轉義字符進行反轉義,在轉義字符前面加上反斜杠即可。

type Person struct {
Name  string `json:"name"`
Age   int    `json:"age"`
Phone string `json:"phone"`
}
func main() {
data := `{
"name": "張三",
"age": 20,
"phone": "13712341234"
}`
var p Person
err := json.Unmarshal([]byte(data), &p)
if err != nil {
panic(err)
}
fmt.Println(p.Name, p.Age, p.Phone)
}

在上面的例子中,我們首先定義了一個Person結構體,然后將一個json字符串解析為Person類型的變量。在json字符串中,我們注意到每個字符串都被雙引號包圍,因為go語言中,字符串中的雙引號也需要進行轉義。