當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


GO Unmarshal用法及代碼示例

GO語言"encoding/json"包中"Unmarshal"函數的用法及代碼示例。

用法:

func Unmarshal(data []byte, v any) error

Unmarshal 解析 JSON-encoded 數據並將結果存儲在 v 指向的值中。如果 v 為 nil 或不是指針,Unmarshal 返回一個 InvalidUnmarshalError

Unmarshal 使用 Marshal 使用的編碼的逆編碼,根據需要分配映射、切片和指針,並具有以下附加規則:

要將 JSON 解組為指針,Unmarshal 首先處理 JSON 為 JSON 文字 null 的情況。在這種情況下,Unmarshal 將指針設置為 nil。否則,Unmarshal 將 JSON 解組為指針指向的值。如果指針為 nil,Unmarshal 為其分配一個新值來指向。

要將 JSON 解組為實現 Unmarshaler 接口的值,Unmarshal 會調用該值的 UnmarshalJSON 方法,包括當輸入為 JSON 空值時。否則,如果該值實現編碼 TextUnmarshaler 並且輸入是 JSON 引用的字符串,Unmarshal 使用該字符串的未引用形式調用該值的 UnmarshalText 方法。

要將 JSON 解組到結構中,Unmarshal 將傳入的對象鍵與 Marshal 使用的鍵(結構字段名稱或其標記)匹配,首選完全匹配但也接受不區分大小寫的匹配。默認情況下,不具有相應結構字段的對象鍵將被忽略(請參閱解碼器DisallowUnknownFields 以獲得替代方案)。

為了將 JSON 解組為接口值,Unmarshal 將其中一項存儲在接口值中:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

要將 JSON 數組解組為切片,Unmarshal 會將切片長度重置為零,然後將每個元素附加到切片。作為一種特殊情況,為了將空 JSON 數組解組為切片,Unmarshal 將切片替換為新的空切片。

要將 JSON 數組解組為 Go 數組,Unmarshal 將 JSON 數組元素解碼為相應的 Go 數組元素。如果 Go 數組小於 JSON 數組,則丟棄額外的 JSON 數組元素。如果 JSON 數組小於 Go 數組,則額外的 Go 數組元素設置為零值。

要將 JSON 對象解組到映射中,Unmarshal 首先建立要使用的映射。如果映射為 nil,Unmarshal 分配一個新映射。否則 Unmarshal 會重用現有映射,保留現有條目。然後 Unmarshal 將 JSON 對象中的鍵值對存儲到映射中。 map 的 key 類型必須是任意字符串類型,整數,實現 json.Unmarshaler,或者實現編碼TextUnmarshaler

如果 JSON 值不適合給定的目標類型,或者 JSON 編號溢出目標類型,Unmarshal 會跳過該字段並盡其所能完成解組。如果沒有遇到更嚴重的錯誤,Unmarshal 返回一個 UnmarshalTypeError 說明最早的此類錯誤。在任何情況下,都不能保證有問題的字段後麵的所有剩餘字段都將被解組到目標對象中。

JSON null 值通過將 Go 值設置為 nil 來解組為接口、映射、指針或切片。因為 null 在 JSON 中經常用來表示“不存在”,所以將 JSON null 解組到任何其他 Go 類型對值沒有影響並且不會產生錯誤。

解組帶引號的字符串時,無效的 UTF-8 或無效的 UTF-16 代理對不會被視為錯誤。相反,它們被 Unicode 替換字符 U+FFFD 替換。

例子:

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var jsonBlob = []byte(`[
	{"Name": "Platypus", "Order": "Monotremata"},
	{"Name": "Quoll",    "Order": "Dasyuromorphia"}
]`)
	type Animal struct {
		Name  string
		Order string
	}
	var animals []Animal
	err := json.Unmarshal(jsonBlob, &animals)
	if err != nil {
		fmt.Println("error:", err)
	}
	fmt.Printf("%+v", animals)
}

輸出:

[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]

相關用法


注:本文由純淨天空篩選整理自golang.google.cn大神的英文原創作品 Unmarshal。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。