Và nhiều ví dụ khi json.Unmarshal()
trả về một lỗi (bên cạnh specif ying một JSON không hợp lệ):
Chỉ định nil
hoặc empty
lát:
i := 0
err := json.Unmarshal(nil, &i)
fmt.Println(err) // unexpected end of JSON input
Xác định một tổ chức phi-con trỏ đến unmarshal thành:
err = json.Unmarshal([]byte(`{"name":"a"}`), i)
fmt.Println(err) // json: Unmarshal(non-pointer int)
Xác định nil
như con trỏ mục tiêu:
err = json.Unmarshal([]byte(`{"name":"a"}`), nil)
fmt.Println(err) // json: Unmarshal(nil)
Chỉ định số JSON thứ tại sẽ tràn loại mục tiêu. Trích dẫn doc của json.Unmarshal()
:
Nếu một giá trị JSON là không thích hợp cho một loại mục tiêu nhất định, hoặc nếu một số JSON tràn các loại mục tiêu, unmarshal bỏ qua lĩnh vực đó và hoàn thành unmarshalling như tốt nhất có thể. Nếu không gặp phải lỗi nghiêm trọng nào khác, Unmarshal trả về một UnmarshalTypeError mô tả lỗi sớm nhất như vậy.
Để chứng minh điều này:
var j int8
err = json.Unmarshal([]byte(`1112`), &j)
fmt.Println(err) // json: cannot unmarshal number 1112 into Go value of type int8
Bạn muốn tạo ví dụ hoạt động hoặc ít nhất là biên dịch, [như thế này] (http://play.golang.org/p/ywOPSds8zQ). 'Unmarshal' sẽ trả về lỗi khi đầu vào không hợp lệ JSON (như, thay đổi' false' thành 'hello', hoặc loại bỏ dấu ngoặc nhọn). – twotwotwo
Đó là tất cả nguồn mở, bạn luôn có thể kiểm tra quá trình triển khai của Unmarshal: https://golang.org/src/encoding/json/decode.go?s=2621:2669#L64 (và checkValid: https://golang.org /src/encoding/json/scanner.go?s=732:781#L16) –