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

embedded/2025/4/1 4:48:29/

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


jsonMarshal_4">1. json.Marshal

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

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}

jsonUnmarshal_22">2. json.Unmarshal

将JSON字节切片解析到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

jsonMarshalIndent_36">3. json.MarshalIndent

生成带缩进格式的JSON。

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

jsonNewEncoder__EncoderEncode_53">4. json.NewEncoderEncoder.Encode

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

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

jsonNewDecoder__DecoderDecode_67">5. json.NewDecoderDecoder.Decode

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

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

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

7. Decoder.DisallowUnknownFields

禁止JSON中出现未知字段。

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类型(避免精度丢失)。

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

jsonValid_118">9. json.Valid

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

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

jsonRawMessage_128">10. json.RawMessage

延迟解析部分JSON数据。

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字段名称、忽略字段等。

type User struct {Name    string `json:"username"`          // 字段重命名为usernameAge     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处理的大部分场景,从简单序列化到复杂的流式处理均可应对。


http://www.ppmy.cn/embedded/177699.html

相关文章

6-项目负责人-创建项目集

项目集是一组相互关联&#xff0c;且被协调管理的项目集合&#xff0c;处于最高层级&#xff0c;属于战略层面的概念。它可以进行多层级的项目管理&#xff0c;帮助管理者站在宏观的视角去制定战略方向和分配资源。同时它支持分层授权&#xff0c;项目集及下面的子项目集、项目…

R 安装和查看历史版本 R 包指南

一、查看 R 包的可用版本 方法 1&#xff1a;通过 CRAN Archive 查看历史版本 你可以通过以下网址格式查看某个 R 包在 CRAN 上的所有历史版本&#xff1a; https://cran.r-project.org/src/contrib/Archive/<包名>/例如查看 Seurat 包的历史版本&#xff1a; https:…

Java制作简单的聊天室(复习)

设计的知识点&#xff1a;几乎包含java基础的全部知识点&#xff08;java基础语法&#xff0c;java基础进阶&#xff1a;双列集合&#xff0c;io流&#xff0c;多线程&#xff0c;网络编程等&#xff09; 代码如下 客户端&#xff1a; 服务器采用的时多线程的循环多线程的方式…

2024年3月全国计算机等级考试真题(二级C语言)

&#x1f600; 第1题 下列叙述中正确的是 A. 矩阵是非线性结构 B. 数组是长度固定的线性表 C. 对线性表只能作插入与删除运算 D. 线性表中各元素的数据类型可以不同 题目解析&#xff1a; A. 矩阵是非线性结构 错误。矩阵通常是二维数组&#xff0c;属…

Ollama 未授权访问

1、产品简介 Ollama 是一款开源跨平台工具&#xff0c;用于本地化部署和管理大语言模型&#xff08;如 DeepSeek-R1、Llama、Phi-4 等&#xff09;&#xff0c;支持 macOS、Windows、Linux 及 Docker 容器化运行。&#xff08;默认监听端口 11434&#xff09; 2、漏洞简介 O…

MySQL高级语句深度解析与应用实践

一、窗口函数&#xff1a;数据分析的利器 1. 窗口函数基础概念 窗口函数(Window Function)是MySQL 8.0引入的强大特性&#xff0c;它可以在不减少行数的情况下对数据进行聚合计算和分析 SELECT employee_name,department,salary,RANK() OVER (PARTITION BY department ORDER…

初识MySQl · 内置函数

目录 前言&#xff1a; 日期类函数 字符串函数 数学类函数 其他函数 前言&#xff1a; 在前文的学习我们已经简单了解了部分函数&#xff0c;比如count()函数什么的&#xff0c;今天我们主要是笼统的学习一下MySQL中的函数&#xff0c;仅仅从使用的角度来学习&#xff0c…

webpackVSVite热更新本质区别

Vite 和 Webpack 都支持热更新&#xff08;HMR&#xff09;&#xff0c;但两者的本质区别在于 Vite 依赖于原生 ES 模块&#xff08;ESM&#xff09;&#xff0c;而 Webpack 依赖于模块打包后的更新机制。 Webpack HMR vs. Vite HMR 的核心区别 Webpack HMR 的实现方式 Webpac…