当前位置: 首页 > article >正文

Go 中 `json.NewEncoder/Decoder` 与 `json.Marshal/Unmarshal` 的区别与实践

Go 中 json.NewEncoder/Decoderjson.Marshal/Unmarshal 的区别与实践(HTTP 示例)

在 Go 中处理 JSON 有两种主要方式:使用 json.Marshal/Unmarshal 和使用 json.NewEncoder/Decoder。它们都能完成 JSON 的序列化与反序列化,但使用场景和优势略有不同。


🌱 一、整体概念对比

功能json.Marshal / json.Unmarshaljson.NewEncoder / json.NewDecoder
输入输出[]byte / stringio.Writer / io.Reader
性能一次性读写,适合小数据流式处理,适合大数据、网络请求体
易用性简洁直观,适合内存中的 JSON 数据可处理流式数据、更适合 HTTP 读写场景
典型应用JSON API 响应构建、配置文件加载等HTTP 请求/响应处理、文件流读取

🚀 二、HTTP 示例对比

我们用两个示例分别展示:

  1. json.NewEncoder/Decoder:直接读写 http.Request.Bodyhttp.ResponseWriter
  2. json.Marshal/Unmarshal:先读完整体,再解析和返回

🧾 公共结构体定义:

type User struct {ID    int    `json:"id"`Name  string `json:"name"`Email string `json:"email"`
}

🧪 方法一:使用 json.NewDecoderjson.NewEncoder

func handlerWithEncoderDecoder(w http.ResponseWriter, r *http.Request) {var user Userif err := json.NewDecoder(r.Body).Decode(&user); err != nil {http.Error(w, "invalid json", http.StatusBadRequest)return}response := map[string]interface{}{"status": "received","user":   user,}w.Header().Set("Content-Type", "application/json")if err := json.NewEncoder(w).Encode(response); err != nil {http.Error(w, "encode error", http.StatusInternalServerError)}
}

🧪 方法二:使用 json.Unmarshaljson.Marshal

func handlerWithMarshal(w http.ResponseWriter, r *http.Request) {bodyBytes, err := io.ReadAll(r.Body)if err != nil {http.Error(w, "read error", http.StatusInternalServerError)return}var user Userif err := json.Unmarshal(bodyBytes, &user); err != nil {http.Error(w, "invalid json", http.StatusBadRequest)return}response := map[string]interface{}{"status": "received","user":   user,}w.Header().Set("Content-Type", "application/json")jsonData, err := json.Marshal(response)if err != nil {http.Error(w, "encode error", http.StatusInternalServerError)return}w.Write(jsonData)
}

⚖️ 三、对比总结

对比点Encoder/DecoderMarshal/Unmarshal
使用便捷性可直接对接 HTTP 输入输出流需要读取/写入中间变量 []byte
适合大数据✅ 是(流式处理)❌ 需一次性加载全部数据
性能优势节省内存,特别适合大请求/响应适合结构简单或数据量小的应用
调试方便较复杂(不便打印中间数据)中间变量可供调试、日志记录

💡 实际建议

  • 接收请求体(尤其大数据或长连接):建议使用 json.NewDecoder
  • 返回响应数据(动态生成):建议使用 json.NewEncoder
  • 处理缓存、小数据、临时结构体转换:使用 json.Marshal/Unmarshal 更方便

🧪 curl 测试命令

curl -X POST http://localhost:8080/encoder \-H "Content-Type: application/json" \-d '{"id": 1, "name": "Alice", "email": "alice@example.com"}'

📚 参考文档

  • encoding/json 包官方文档

希望这篇文章能帮助你理解 json.Marshal/Unmarshaljson.NewEncoder/Decoder 的差异,并选择适合你项目场景的方式。

http://www.lryc.cn/news/2401127.html

相关文章:

  • UE5 2D角色PaperZD插件动画状态机学习笔记
  • Ubuntu 16.04 密码找回
  • 【论文阅读】DanceGRPO: Unleashing GRPO on Visual Generation
  • CentOS在vmware局域网内搭建DHCP服务器【踩坑记录】
  • AI炼丹日志-28 - Audiblez 将你的电子书epub转换为音频mp3 做有声书
  • 图像处理篇---face_recognition库实现人脸检测
  • 74. 搜索二维矩阵 (力扣)
  • 8088单板机C语言sprintf()格式化串口输出---Prj04
  • 板凳-------Mysql cookbook学习 (九)
  • 深入解析 Flask 命令行工具与 flask run命令的使用
  • 第6篇:中间件 SQL 重写与语义分析引擎实现原理
  • 基于SpringBoot的“嗨玩旅游”网站设计与实现(源码+定制+开发)嗨玩旅游平台开发:景点展示与个性化推荐系统(SpringBoot)
  • python版若依框架开发:python版若依部署
  • React进阶:状态管理选择题
  • h5的aliplayer-min.js 加密视频会走到debugger
  • 第5篇《中间件负载均衡与连接池管理机制设计》
  • DashBoard安装使用
  • 极客大挑战 2019 EasySQL 1(万能账号密码,SQL注入,HackBar)
  • C# CallerMemberName特性
  • 采用 Docker GPU 部署的 Ubuntu 或者 windows 桌面环境
  • 关于面试找工作的总结(四)
  • 分布式拜占庭容错算法——实现工作量证明(PoW)算法详解
  • 深度解析Mysql中MVCC的工作机制
  • MP4文件声音与视频分离
  • 接口自动化测试之pytest 运行方式及前置后置封装
  • 服务器被攻击了怎么办
  • 06-排序
  • python,shell,linux,bash概念的不同和对比联系
  • FPGA管脚类型,及选择
  • 如何在 Ubuntu22.04 上安装并开始使用 RabbitMQ