探索 Go 语言的 json 库

发布于:2024-08-08 ⋅ 阅读:(165) ⋅ 点赞:(0)

在 Go 语言中,json 包是一个用于处理 JSON 数据的原生库,它能够将 JSON 数据编码和解码为 Go 的原生类型。以下是对 json 包中一些核心方法的介绍和示例。

1. Unmarshal 方法

Unmarshaljson 包中最常用的方法之一,它将 JSON 编码的数据解码到 Go 的值中。这个方法需要两个参数:一个是包含 JSON 数据的字节切片,另一个是要将数据解码到的 Go 变量的指针。

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

func main() {
	jsonData := `{"name": "Kimi", "age": 6, "isAI": true}`

	type Person struct {
		Name string
		Age  int
		IsAI bool
	}

	var p Person
	err := 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 类型

Numberjson 包中的一个特殊类型,用于表示 JSON 中的数字。它可以被转换为 string,也可以解析为 float64int64

func main() {
	var n json.Number
	n = "123.45"

	strVal := n.String()           // "123.45"
	floatVal, _ := n.Float64()     // float64 number
	intVal, _ := n.Int64()         // int64 number
}

4. Unmarshaler 接口

Unmarshaler 是一个接口,如果一个类型实现了这个接口,Unmarshal 方法会调用该类型的 UnmarshalJSON 方法来进行自定义解码。

type MyCustomType struct {
	// ...
}

func (m *MyCustomType) UnmarshalJSON(data []byte) error {
	// 自定义解码逻辑
}

5. 错误处理

json 包提供了多种错误类型,例如 UnmarshalTypeErrorInvalidUnmarshalError,这些错误类型可以帮助开发者更好地理解解码过程中出现的问题。

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 包。