package main import ( "bytes" "encoding/json" "fmt" "io" "strings" ) //HTMLEscape 函数将添加Buffer中的特殊字符串进行转义(Buffer中本来就有的字节不会转义只会转义后来添加的) //Compact 对这些特殊字符不进行转义 但是有一个作用就是在拼接字符串时 如果后面的字符串有问题那么不添加到Buffer中相当于自动帮我们检查了 //Compact 是个很有用的函数试想一下如果不用Compact直接拼接字符串那么如果其中第n个json串格式有问题就会导致后面所有的json串无法解析 //而使用了Compact来解析 假如拼接到第n个json串有问题会直接抛弃这个json串而不会去影响到后面json串的解析 //比如例子中errJson字符串的格式是有问题的 通过Compact会自动检查所以最后输出的结果是不包含errJson的 //特殊字符都有<, >, &, U+2028 and U+2029 转义成 \u003c, \u003e, \u0026, \u2028, \u2029 func main() { buf := bytes.NewBufferString("") str := `{"Name":"<wujunbin>", "Age":21}` errJson := `{Name:"<wujunbin>", "Age":21}` //拼接json串 fmt.Println(json.Compact(buf, []byte(str))) fmt.Println(json.Compact(buf, []byte(errJson))) bufEscape := bytes.NewBufferString("") //拼接转义的json串 但是不会帮你检查错误 json.HTMLEscape(bufEscape, buf.Bytes()) //result is {"Name":"\u003cwujunbin\u003e","Age":21} fmt.Printf("%s \n", string(bufEscape.Bytes())) type Person struct { Name string Age int } decoder := json.NewDecoder(strings.NewReader(string(buf.Bytes()))) for { var p Person if err := decoder.Decode(&p); err == io.EOF { break } else if err != nil { fmt.Println(err) break } fmt.Println(p) } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
有疑问加站长微信联系(非本文作者)