假设我有一个类似的结构
type A struct{
name string`json:"name"`
}
Run Code Online (Sandbox Code Playgroud)
然后在主要我有代码
var jsonString string = `{"status":false}`
var a A
error := json.Unmarshal([]byte(jsonString),&a)
Run Code Online (Sandbox Code Playgroud)
显然上面的代码产生了一个nil错误,无论json格式是不同的.什么时候json.Unmarshal()会在Go中返回错误?
Cer*_*món 18
如果源中的值与目标中的值不对应,则JSON解码器不会报告错误.例如,如果源包含字段"status",则不是错误,但目标不包含.
Unmarshal函数确实在其他情况下返回错误:
语法错误
type A struct {
Name string `json:"name"`
}
data = []byte(`{"name":what?}`)
err = json.Unmarshal(data, &a)
fmt.Println(err) // prints character 'w' looking for beginning of value
Run Code Online (Sandbox Code Playgroud)
类型不匹配
data := []byte(`{"name":false}`)
type B struct {
Name string `json:"name"`
}
var b B
err = json.Unmarshal(data, &b)
fmt.Println(err) // prints cannot unmarshal bool into Go value of type string
Run Code Online (Sandbox Code Playgroud)
json.Unmarshal()返回错误时的更多示例(除了指定无效的JSON之外):
指定一个nil或empty切片:
i := 0
err := json.Unmarshal(nil, &i)
fmt.Println(err) // unexpected end of JSON input
Run Code Online (Sandbox Code Playgroud)
指定unmarshal的非指针:
err = json.Unmarshal([]byte(`{"name":"a"}`), i)
fmt.Println(err) // json: Unmarshal(non-pointer int)
Run Code Online (Sandbox Code Playgroud)
指定nil为目标指针:
err = json.Unmarshal([]byte(`{"name":"a"}`), nil)
fmt.Println(err) // json: Unmarshal(nil)
Run Code Online (Sandbox Code Playgroud)
指定将溢出目标类型的JSON编号.引用以下文件json.Unmarshal():
如果JSON值不适合给定的目标类型,或者如果JSON编号溢出目标类型,则Unmarshal会跳过该字段并尽可能完成解组.如果没有遇到更严重的错误,Unmarshal将返回描述最早此类错误的UnmarshalTypeError.
为了证明这一点:
var j int8
err = json.Unmarshal([]byte(`1112`), &j)
fmt.Println(err) // json: cannot unmarshal number 1112 into Go value of type int8
Run Code Online (Sandbox Code Playgroud)