Go 语言标准库中encoding/json模块详细功能介绍与示例

Go语言的encoding/json模块提供了丰富的JSON编解码方法,以下是对各主要方法及结构体标签的详细说明和示例:


1. json.Marshal

将Go对象转换为JSON字节切片。

go 复制代码
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

p := Person{"Alice", 30}
data, err := json.Marshal(p)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data)) // 输出: {"name":"Alice","age":30}

2. json.Unmarshal

将JSON字节切片解析到Go对象。

go 复制代码
jsonStr := `{"name":"Bob","age":25}`
var p Person
err := json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
    log.Fatal(err)
}
fmt.Println(p.Name) // 输出: Bob

3. json.MarshalIndent

生成带缩进格式的JSON。

go 复制代码
data, err := json.MarshalIndent(p, "", "  ")
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data))
// 输出:
// {
//   "name": "Alice",
//   "age": 30
// }

4. json.NewEncoderEncoder.Encode

将JSON写入io.Writer(如文件或HTTP响应)。

go 复制代码
file, _ := os.Create("person.json")
encoder := json.NewEncoder(file)
err := encoder.Encode(p)
if err != nil {
    log.Fatal(err)
}
// 文件内容: {"name":"Alice","age":30}

5. json.NewDecoderDecoder.Decode

io.Reader(如文件或HTTP请求)读取并解析JSON。

go 复制代码
file, _ := os.Open("person.json")
var p Person
decoder := json.NewDecoder(file)
err := decoder.Decode(&p)
if err != nil {
    log.Fatal(err)
}
fmt.Println(p.Name) // 输出: Alice

6. Encoder.SetEscapeHTML

控制是否转义HTML字符(默认true)。

go 复制代码
encoder := json.NewEncoder(os.Stdout)
encoder.SetEscapeHTML(false)
encoder.Encode("<div>test</div>")
// 输出: "<div>test</div>"

7. Decoder.DisallowUnknownFields

禁止JSON中出现未知字段。

go 复制代码
jsonStr := `{"name":"Charlie","age":35,"gender":"male"}`
decoder := json.NewDecoder(strings.NewReader(jsonStr))
decoder.DisallowUnknownFields()
err := decoder.Decode(&p) // 报错: json: unknown field "gender"

8. Decoder.UseNumber

将数字解析为json.Number类型(避免精度丢失)。

go 复制代码
jsonStr := `{"age": 30}`
decoder := json.NewDecoder(strings.NewReader(jsonStr))
decoder.UseNumber()
var result map[string]interface{}
decoder.Decode(&result)
age, _ := result["age"].(json.Number).Int64()
fmt.Println(age) // 输出: 30

9. json.Valid

验证字节切片是否为合法JSON。

go 复制代码
data := []byte(`{"name":"Alice"}`)
valid := json.Valid(data)
fmt.Println(valid) // 输出: true

10. json.RawMessage

延迟解析部分JSON数据。

go 复制代码
type RawExample struct {
    Data json.RawMessage `json:"data"`
}
rawJson := `{"data": {"key": "value"}}`
var re RawExample
json.Unmarshal([]byte(rawJson), &re)
// re.Data 保持原始JSON: {"key":"value"}

结构体标签(Struct Tags)

控制JSON字段名称、忽略字段等。

go 复制代码
type User struct {
    Name    string `json:"username"`          // 字段重命名为username
    Age     int    `json:"age,omitempty"`     // 如果Age为0,则省略
    Secret  string `json:"-"`                 // 忽略该字段
}

u := User{Name: "Dave", Age: 0}
data, _ := json.Marshal(u)
fmt.Println(string(data)) // 输出: {"username":"Dave"}

总结

  • 常用方法MarshalUnmarshalMarshalIndentNewEncoderNewDecoder
  • 流处理 :使用EncoderDecoder处理网络或文件流。
  • 高级控制SetEscapeHTMLDisallowUnknownFieldsUseNumber
  • 验证与延迟解析ValidRawMessage
  • 字段定制:通过结构体标签灵活控制JSON映射。

这些方法覆盖了JSON处理的大部分场景,从简单序列化到复杂的流式处理均可应对。

相关推荐
知无不研1 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29141 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
IT_陈寒2 小时前
Python的GIL让我多写了500行代码
前端·人工智能·后端
C++ 老炮儿的技术栈3 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011163 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据3 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡3 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai4 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
IT爱学堂4 小时前
精讲软件设计师(软考中级)一站式通关课_实战课程_慕课网
后端
瑞码空间4 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing