在 Go 语言中,json
包是一个用于处理 JSON 数据的原生库,它能够将 JSON 数据编码和解码为 Go 的原生类型。以下是对 json
包中一些核心方法的介绍和示例。
1. Unmarshal
方法
Unmarshal
是 json
包中最常用的方法之一,它将 JSON 编码的数据解码到 Go 的值中。这个方法需要两个参数:一个是包含 JSON 数据的字节切片,另一个是要将数据解码到的 Go 变量的指针。
package mainimport ("encoding/json""fmt""log"
)func main() {jsonData := `{"name": "Kimi", "age": 6, "isAI": true}`type Person struct {Name stringAge intIsAI bool}var p Personerr := json.Unmarshal([]byte(jsonData), &p)if err != nil {log.Fatal(err)}fmt.Printf("%+v\n", p)
}
2. Marshal
方法
与 Unmarshal
相对应,Marshal
方法将 Go 的值编码为 JSON 数据。这个方法通常用于将 Go 的结构体或其他类型转换成 JSON 格式的字符串。
func main() {p := Person{Name: "Kimi", Age: 6, IsAI: true}jsonData, err := json.Marshal(p)if err != nil {log.Fatal(err)}fmt.Println(string(jsonData))
}
3. Number
类型
Number
是 json
包中的一个特殊类型,用于表示 JSON 中的数字。它可以被转换为 string
,也可以解析为 float64
或 int64
。
func main() {var n json.Numbern = "123.45"strVal := n.String() // "123.45"floatVal, _ := n.Float64() // float64 numberintVal, _ := n.Int64() // int64 number
}
4. Unmarshaler
接口
Unmarshaler
是一个接口,如果一个类型实现了这个接口,Unmarshal
方法会调用该类型的 UnmarshalJSON
方法来进行自定义解码。
type MyCustomType struct {// ...
}func (m *MyCustomType) UnmarshalJSON(data []byte) error {// 自定义解码逻辑
}
5. 错误处理
json
包提供了多种错误类型,例如 UnmarshalTypeError
和 InvalidUnmarshalError
,这些错误类型可以帮助开发者更好地理解解码过程中出现的问题。
err := json.Unmarshal([]byte(`{"age": "notANumber"}`), &p)
if err != nil {if uerr, ok := err.(*json.UnmarshalTypeError); ok {log.Printf("Type error at offset %d: %s", uerr.Offset, uerr)}
}
结语
Go 语言的 json
包功能强大,使用简便,是处理 JSON 数据的理想选择。通过上述示例,我们可以看到如何使用 json
包进行编解码操作,以及如何通过实现接口来自定义解码过程。希望这篇博客能帮助你更好地理解和使用 Go 的 json
包。