在使用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語言中,字符串中的雙引號也需要進行轉義。