3 回答

TA貢獻1794條經驗 獲得超8個贊
如果源中的值與目標中的值不對應,JSON 解碼器不會報告錯誤。例如,如果源包含字段“狀態”,但目標不包含,這不是錯誤。
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
目標類型無法表示的 JSON 值:
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
(這是一個不能用目標類型表示值的例子。還有更多。)

TA貢獻1942條經驗 獲得超3個贊
還有更多json.Unmarshal()返回錯誤的示例(除了指定無效的 JSON):
指定一個nil或empty切片:
i := 0
err := json.Unmarshal(nil, &i)
fmt.Println(err) // unexpected end of JSON input
指定一個非指針解組為:
err = json.Unmarshal([]byte(`{"name":"a"}`), i)
fmt.Println(err) // json: Unmarshal(non-pointer int)
指定nil為目標指針:
err = json.Unmarshal([]byte(`{"name":"a"}`), nil)
fmt.Println(err) // json: Unmarshal(nil)
指定會溢出目標類型的 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
或者當嘗試將某些內容解析time.Time為不是 RFC3339 時間戳的 a 時:
var t time.Time
err = json.Unmarshal([]byte(`"xx"`), &t)
fmt.Println(err) // parsing time ""xx"" as ""2006-01-02T15:04:05Z07:00"": cannot parse "xx"" as "2006"

TA貢獻1946條經驗 獲得超4個贊
要添加到 icza 的答案中,如果您嘗試將 Unmarshal 解組為類型化的 nil 指針,您也可能會收到錯誤消息。例如,如果您創建一個指向特定類型的指針切片,然后嘗試解組為這些指針中的特定一個,則可能會發生這種情況。
package main
import (
"fmt"
"encoding/json"
)
type Example struct {Name string}
func main() {
exs := make([]*Example, 5)
err := json.Unmarshal([]byte(`{"name":"jane"}`), exs[0])
fmt.Println(err)
}
// json: Unmarshal(nil *main.Example)
- 3 回答
- 0 關注
- 403 瀏覽
添加回答
舉報