Golang 第四章 5.json

  • By v2ray节点

  • 2026-03-24 16:08:11

  • 评论


Go 提供 encoding/json 包来处理 JSON 数据。

JSON 是 键值对表示的轻量级数据交换格式,广泛用于 Web API。



将结构体编码为 JSON

import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string
    Age  int
}
func main() {
    p := Person{Name: "Alice", Age: 30}
    b, err := json.Marshal(p)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}

输出:

{"Name":"Alice","Age":30}

默认字段名与结构体字段相同

JSON 使用大写字段名才能导出(必须首字母大写)



使用结构体标签自定义 JSON 字段名

type Person struct {
Name string `json:"name"`
Age  int    `json:"age"`
}

标签在反射时可用

编码后输出:

{"name":"Alice","age":30}


忽略字段

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"-"`
}

- 表示编码时忽略该字段



JSON 解码为结构体

data := []byte(`{"name":"Alice","age":30}`)
var p Personerr := json.Unmarshal(data, &p)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(p.Name, p.Age) // Alice 30

Unmarshal 需要传入 结构体指针



JSON 解码为 map

var m map[string]interface{}
json.Unmarshal(data, &m)
fmt.Println(m["name"]) // Alice

值类型是 interface{}

适合未知 JSON 结构



切片和嵌套 JSON

type Person struct {    Name string   `json:"name"`    Age  int      `json:"age"`    Tags []string `json:"tags"`}data := []byte(`{"name":"Bob","age":25,"tags":["go","dev"]}`)var p Personjson.Unmarshal(data, &p)fmt.Println(p.Tags) // [go dev]

支持数组、切片
支持嵌套结构体



小技巧

JSON key 必须首字母大写 或加标签

nil 切片 编码成 []

nil map 编码成 {}

v2ray节点购买