基本的 JSON 解码

json.Unmarshalencoding/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 类型