基本的 JSON 解碼
json.Unmarshal
從 encoding/json
解碼 JSON 值到由給定的變數指示的值的包。
引數是要在 []bytes
中解碼的值,以及用作反序列化值的儲存的變數。返回的值是錯誤(失敗時)。
encodedValue := []byte(`{"London":18,"Rome":30}`)
// generic storage for the decoded JSON
var data map[string]interface{}
// decode the value into data
// notice that we must pass the pointer to data using &data
err := json.Unmarshal(encodedValue, &data)
// check if the decoding is successful
if err != nil {
panic(err)
}
fmt.Println(data)
map[London:18 Rome:30]
請注意,在上面的示例中,我們事先知道了鍵的型別和值。但情況並非總是如此。實際上,在大多數情況下,JSON 包含混合值型別。
encodedValue := []byte(`{"city":"Rome","temperature":30}`)
// generic storage for the decoded JSON
var data map[string]interface{}
// decode the value into data
if err := json.Unmarshal(encodedValue, &data); err != nil {
panic(err)
}
// if you want to use a specific value type, we need to cast it
temp := data["temperature"].(float64)
fmt.Println(temp) // 30
city := data["city"].(string)
fmt.Println(city) // "Rome"
在上面的最後一個例子中,我們使用通用對映來儲存解碼值。我們必須使用 map[string]interface{}
,因為我們知道鍵是字串,但我們事先並不知道它們的值的型別。
這是一種非常簡單的方法,但它也非常有限。在現實世界中,你通常會將 JSON 解碼為自定義的 struct
型別 。