wx

关注公众号

encoding/json


Golang 标准库 - encoding/json

encoding/json 包实现了 JSON 对象的编码和解码。RFC 7159 定义了 JSON 格式。

主要功能说明:

  1. 编码(序列化)

    • Marshal() 将 Go 值编码为 JSON
    • MarshalIndent() 格式化编码
    • Encoder 流式编码
  2. 解码(反序列化)

    • Unmarshal() 解码 JSON 到 Go 值
    • Decoder 流式解码
    • RawMessage 延迟解码
  3. 结构体标签

    • json:"name" 指定 JSON 字段名
    • json:"-" 忽略字段
    • json:",omitempty" 空值时省略
  4. 自定义编码

    • 实现 Marshaler 接口
    • 实现 Unmarshaler 接口

type Person struct {
	Name    string   `json:"name"`
	Age     int      `json:"age"`
	Email   string   `json:"email,omitempty"`
	Hobbies []string `json:"hobbies,omitempty"`
	// 忽略此字段
	Password string `json:"-"`
}

func main() {
	// 1. 结构体编码为 JSON
	fmt.Println("=== 编码 ===")
	person := Person{
		Name:     "Alice",
		Age:      30,
		Hobbies:  []string{"reading", "coding"},
		Password: "secret",
	}

	// 标准编码
	data, err := json.Marshal(person)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Marshal:", string(data))

	// 格式化编码
	prettyData, _ := json.MarshalIndent(person, "", "  ")
	fmt.Println("\nMarshalIndent:")
	fmt.Println(string(prettyData))

	// 2. JSON 解码为结构体
	fmt.Println("\n=== 解码 ===")
	jsonStr := `{"name":"Bob","age":25,"email":"bob@example.com"}`
	
	var p Person
	err = json.Unmarshal([]byte(jsonStr), &p)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("解码结果: %+v\n", p)

	// 3. 动态类型处理
	fmt.Println("\n=== 动态类型 ===")
	var result map[string]interface{}
	json.Unmarshal([]byte(jsonStr), &result)
	fmt.Printf("map: %v\n", result)
	fmt.Printf("name: %v\n", result["name"])

	// 4. 流式编码
	fmt.Println("\n=== 流式编码 ===")
	encoder := json.NewEncoder(os.Stdout)
	encoder.SetIndent("", "  ")
	encoder.Encode(person)

	// 5. JSON 数组处理
	fmt.Println("\n=== JSON 数组 ===")
	jsonArray := `[{"name":"Alice","age":30},{"name":"Bob","age":25}]`
	var people []Person
	json.Unmarshal([]byte(jsonArray), &people)
	fmt.Printf("数组: %+v\n", people)
}
如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo