首頁 >後端開發 >Golang >如何解決 golang 中的 'cannot unmarshal…” 錯誤?

如何解決 golang 中的 'cannot unmarshal…” 錯誤?

WBOY
WBOY原創
2023-06-24 20:01:594345瀏覽

在 Golang 的開發過程中,我們常常會使用 JSON 來進行資料交換和序列化。然而,當我們嘗試將 JSON 資料反序列化成結構體時,有時會遇到 “cannot unmarshal…” 的錯誤。這個錯誤訊息比較晦澀,不容易理解,讓人無從下手。本篇文章將幫助你理解這個錯誤的原因,並提供幾個解決方案。

解決方法一:檢查結構體成員變數的型別

“cannot unmarshal…” 錯誤通常是由於JSON 字串中的值與結構體成員變數的型別不匹配所引起的。為了避免這種錯誤,我們應該確保在聲明結構體時,每個成員變數的類型都能與 JSON 中的對應值相符。

例如,我們定義瞭如下結構體:

type Person struct {
    Name string
    Age  int
}

如果我們嘗試將下面的JSON 反序列化成結構體,就會遇到“cannot unmarshal…” 錯誤:

{
    "Name": "Lucy",
    "Age": "28"
}

這是因為JSON 中的Age 值類型是字串,不能與結構體中的Age 成員變數類型int 相符。我們需要將 Age 的類型定義為 string,才能正確地反序列化 JSON 資料。

解決方案二:檢查結構體成員變數的標籤

通常情況下,如果我們在結構體成員變數中為欄位定義了標籤(tag),那麼標籤資訊會在反序列化時對JSON 資料進行指導,用於識別每個欄位的名稱及其他細節。因此,在進行 JSON 反序列化時,如果標籤資訊與 JSON 資料中的屬性名稱不匹配,也可能會導致這個錯誤的出現。

例如,我們定義瞭如下結構體:

type Person struct {
    Name string `json:"PersonName"`
    Age  int    `json:"PersonAge"`
}

如果我們嘗試將下面的JSON 反序列化成結構體,同樣會遇到“cannot unmarshal…” 錯誤:

{
    "Name": "Lucy",
    "Age": 28
}

這是因為我們在結構體中給Name 和Age 兩個欄位定義了標籤,而標籤中所定義的欄位名稱與JSON 資料中的屬性名稱不一致。因此,我們需要將 JSON 資料中的屬性名修改為結構體中所定義的標籤名,才能正確的反序​​列化。

解決方法三:使用golang 自帶的json 套件進行註解

另一種方法是使用golang 自帶的json 包,透過註解的方式防止出現「cannot unmarshal…」錯誤。這個方法需要我們在定義結構體時,為每個欄位新增json 標籤,如下所示:

type Person struct {
    Name string `json:"name"`
    Age int `json:"age"`
}

在進行JSON 反序列化時,我們需要在程式碼中使用json.Unmarshal 方法,並將JSON 資料作為輸入。這樣就可以正確的反序​​列化JSON 資料了,例如:

p := &Person{}
jsonData := []byte(`{"name":"John","age":18}`)
err := json.Unmarshal(jsonData, p)
if err != nil {
    fmt.Println("Unmarshal error: ", err)
}
fmt.Printf("Name: %s, Age: %d", p.Name, p.Age)

總結

#在大多數情況下,「cannot unmarshal…」錯誤通常是由於JSON 資料中的類型與結構體成員變數的類型不符或是標籤資訊與JSON 資料中的屬性名稱不符所造成的。透過對這些問題進行仔細的檢查,我們就可以避免這個錯誤的出現。如果你想更好地解決這個錯誤,請使用 Golang 隨附的 json 套件進行註解管理。

以上是如何解決 golang 中的 'cannot unmarshal…” 錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn