Go 生态最快 JSON 库 - jsoniter
Go 生态最快 JSON 库 - jsoniterjsoniter是高性能 JSON 编解码库性能是 Go 标准库encoding/json的 3-10 倍同时完全兼容标准库 API替换成本极低。它通过零堆内存分配、SIMD 指令优化、流式处理等技术在高并发、大数据量的 JSON 处理场景下表现极其出色是目前 Go 后端开发的首选 JSON 库。环境搭建Go 版本 ≥ 1.12# 安装 jsoniter 核心库go get github.com/json-iterator/go核心 API 详解jsoniter最大的优势之一是完全兼容标准库encoding/json的 API你可以直接替换导入语句无需修改业务代码即可获得性能提升同时它还提供了更便捷、更高性能的专属 API覆盖 99% 的开发场景。如果你之前用的是标准库encoding/json只需把导入语句换成jsoniter代码一行都不用改性能直接提升。零成本替换只需替换导入语句所有标准库 API 都能直接用这是jsoniter最友好的一点。Tag 完全兼容标准库的json:tag完全支持无需修改。API作用标准库对比jsoniter.Marshal(obj)序列化结构体 → JSON 字节串完全兼容json.Marshaljsoniter.Unmarshal(data, obj)反序列化JSON 字节串 → 结构体完全兼容json.Unmarshaljsoniter.NewEncoder(w).Encode(obj)流式序列化直接写入 io.Writer完全兼容json.Encoderjsoniter.NewDecoder(r).Decode(obj)流式反序列化直接从 io.Reader 读取完全兼容json.Decoder// 定义模型typeUserstruct{IDuintjson:idUsernamestringjson:usernameEmailstringjson:emailAgeuintjson:age}funcmain(){// 1. 序列化结构体 → JSONuser:User{ID:1,Username:zhangsan,Email:zhangsanexample.com,Age:20}jsonData,err:jsoniter.Marshal(user)iferr!nil{fmt.Printf(序列化失败%v\n,err)return}fmt.Printf(序列化结果%s\n,jsonData)// 2. 反序列化JSON → 结构体varnewUser Useriferr:jsoniter.Unmarshal(jsonData,newUser);err!nil{fmt.Printf(反序列化失败%v\n,err)return}fmt.Printf(反序列化结果%v\n,newUser)}高性能便捷 APIjsoniter 专属API作用优势jsoniter.MarshalToString(obj)序列化结构体 → JSON 字符串直接返回字符串无需手动转换[]byte性能更高jsoniter.UnmarshalFromString(data, obj)反序列化JSON 字符串 → 结构体直接接收字符串参数无需手动转换[]bytejsoniter.Get(data, path).Any()部分解析只读取 JSON 中指定字段的值无需解析整个 JSON性能极高适合只需要部分字段的场景序列化到字符串user:User{ID:1,Username:zhangsan,Email:zhangsanexample.com,Age:20}// 直接返回 string无需 string(jsonData) 转换jsonStr,err:jsoniter.MarshalToString(user)iferr!nil{fmt.Printf(序列化失败%v\n,err)return}fmt.Printf(序列化字符串%s\n,jsonStr)从字符串反序列化varnewUser User// 直接接收 string无需 []byte(jsonStr) 转换iferr:jsoniter.UnmarshalFromString(jsonStr,newUser);err!nil{fmt.Printf(反序列化失败%v\n,err)return}fmt.Printf(反序列化结果%v\n,newUser)部分解析(Get):只读取需要的字段无需解析整个 JSON// 场景只需要 JSON 中的 username不需要解析整个结构体jsonData:[]byte({id:1,username:zhangsan,email:zhangsanexample.com,age:20})// Get 路径username直接获取该字段的值username:jsoniter.Get(jsonData,username).ToString()age:jsoniter.Get(jsonData,age).ToUint()fmt.Printf(部分解析username%s, age%d\n,username,age)MarshalToString/UnmarshalFromString避免了[]byte和string的手动转换代码更简洁性能更高减少内存拷贝。Get部分解析这是jsoniter的杀手级功能无需解析整个 JSON直接通过路径读取指定字段性能提升 10 倍以上特别适合只需要 JSON 中少数字段的场景如日志解析、第三方接口回调只取部分数据。底层高性能 APIIterator/Stream极致性能如果你对性能有极致要求如高并发网关、日志处理系统jsoniter提供了底层的Iterator反序列化和Stream序列化 API可实现零堆内存分配性能达到极致。API作用适用场景jsoniter.ParseBytes(data)创建 Iterator从字节串解析高性能反序列化jsoniter.NewStream(cfg, w, bufSize)创建 Stream序列化到 io.Writer高性能序列化jsonData:[]byte({id:1,username:zhangsan,email:zhangsanexample.com,age:20})// 创建 Iteratoriter:jsoniter.ParseBytes(jsonData)// 手动解析字段按 JSON 顺序读取性能最高variduintvarusernamestring// 读取对象开始iter.ReadObjectCB(func(iter*jsoniter.Iterator,fieldstring)bool{switchfield{caseid:iditer.ReadUint()caseusername:usernameiter.ReadString()default:// 跳过不需要的字段iter.Skip()}returntrue// 继续读取下一个字段})ifiter.Error!nil{fmt.Printf(解析失败%v\n,iter.Error)return}fmt.Printf(Iterator 解析结果id%d, username%s\n,id,username)适用场景:极致性能要求如每秒处理百万级 JSON 的日志系统、高并发 API 网关。内存敏感场景Iterator/Stream可实现零堆内存分配大幅降低 GC 压力。全局配置忽略未知字段标准库默认会在反序列化时遇到未知字段报错除非使用DisallowUnknownFieldsjsoniter可通过全局配置默认忽略未知字段更符合实际开发场景。并发安全全局配置的jsoniter实例是并发安全的可在多个 goroutine 中同时使用。// 配置全局 jsoniter 实例varjsonjsoniter.Config{// 忽略未知字段反序列化时遇到 JSON 中有但结构体中没有的字段直接跳过不报错DisallowUnknownFields:false,// 其他配置...}.Froze()typeUserstruct{Usernamestringjson:username}funcmain(){// JSON 中有 email 字段但 User 结构体中没有jsonStr:{username:zhangsan,email:zhangsanexample.com}varuser User// 使用全局配置的 json 实例iferr:json.UnmarshalFromString(jsonStr,user);err!nil{fmt.Printf(反序列化失败%v\n,err)return}fmt.Printf(忽略未知字段结果%v\n,user)}