亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go : json.Unmarshal 什么時候會返回 struct 錯誤?

Go : json.Unmarshal 什么時候會返回 struct 錯誤?

Go
catspeake 2021-11-08 17:00:23
假設我有一個像type A struct{  name string`json:"name"`}然后在主要我有代碼var jsonString string = `{"status":false}`var a Aerror := json.Unmarshal([]byte(jsonString),&a)顯然上面的代碼會產生一個 nil 錯誤,不管 json 格式是不同的。json.Unmarshal() 什么時候會在 Go 中返回錯誤?
查看完整描述

3 回答

?
幕布斯7119047

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

(這是一個不能用目標類型表示值的例子。還有更多。)


查看完整回答
反對 回復 2021-11-08
?
手掌心

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"



查看完整回答
反對 回復 2021-11-08
?
絕地無雙

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)


查看完整回答
反對 回復 2021-11-08
  • 3 回答
  • 0 關注
  • 403 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號