Go处理JSON数组字符串的常用第三方库代码示例
作者:学亮编程手记
在Go语言中,处理JSON数组是一项常见的任务,JSON(JavaScript Object Notation)是一种常用的数据交换格式,而数组是其中一种重要的数据结构,本文将介绍如何使用Go语言处理JSON数组字符串,并提供相应的源代码和描述,需要的朋友可以参考下
对于 JSON 数组字符串的处理,Go 提供了多种方式。同时也有一些高效的第三方库可供选择。
1. 使用标准库处理 JSON 数组
基本数组处理
package main import ( "encoding/json" "fmt" "log" ) type User struct { Name string `json:"name"` Age int `json:"age"` } func main() { // JSON 数组字符串 jsonArrayStr := `[ {"name":"张三","age":25}, {"name":"李四","age":30}, {"name":"王五","age":28} ]` // 方法1: 解析到结构体切片 var users []User err := json.Unmarshal([]byte(jsonArrayStr), &users) if err != nil { log.Fatal("JSON 解析错误:", err) } for _, user := range users { fmt.Printf("姓名: %s, 年龄: %d\n", user.Name, user.Age) } // 方法2: 解析到 interface{} 切片 var data []map[string]interface{} err = json.Unmarshal([]byte(jsonArrayStr), &data) if err != nil { log.Fatal("JSON 解析错误:", err) } for _, item := range data { fmt.Printf("姓名: %v, 年龄: %v\n", item["name"], item["age"]) } }
流式处理大数组
func streamJSONArray() { jsonArrayStr := `[ {"name":"用户1","age":20}, {"name":"用户2","age":25}, {"name":"用户3","age":30} ]` reader := strings.NewReader(jsonArrayStr) decoder := json.NewDecoder(reader) // 读取开始数组标记 token, err := decoder.Token() if err != nil || token != json.Delim('[') { log.Fatal("不是有效的 JSON 数组") } // 逐个解码数组元素 for decoder.More() { var user User if err := decoder.Decode(&user); err != nil { log.Fatal("解码错误:", err) } fmt.Printf("流式读取: %+v\n", user) } }
2. 高效的第三方库推荐
2.1 json-iterator/go - 高性能 JSON 库
go get github.com/json-iterator/go
import jsoniter "github.com/json-iterator/go" func useJsonIterator() { jsonArrayStr := `[{"name":"张三","age":25},{"name":"李四","age":30}]` var json = jsoniter.ConfigCompatibleWithStandardLibrary var users []User err := json.Unmarshal([]byte(jsonArrayStr), &users) if err != nil { log.Fatal("JSON 解析错误:", err) } fmt.Println("json-iterator 解析结果:", users) }
2.2 gjson - 快速 JSON 查询
go get github.com/tidwall/gjson
import "github.com/tidwall/gjson" func useGJSON() { jsonArrayStr := `[ {"name":"张三","age":25,"active":true}, {"name":"李四","age":30,"active":false}, {"name":"王五","age":28,"active":true} ]` // 快速查询特定字段 result := gjson.Get(jsonArrayStr, "#.name") fmt.Println("所有姓名:", result.Array()) // 获取第一个用户的年龄 age := gjson.Get(jsonArrayStr, "0.age") fmt.Println("第一个用户年龄:", age.Int()) // 条件查询 activeUsers := gjson.Get(jsonArrayStr, `#(active==true)#`) activeUsers.ForEach(func(key, value gjson.Result) bool { fmt.Println("活跃用户:", value.Get("name").String()) return true }) }
2.3 fastjson - 极速 JSON 解析
go get github.com/valyala/fastjson
import "github.com/valyala/fastjson" func useFastJSON() { jsonArrayStr := `[{"name":"张三","age":25},{"name":"李四","age":30}]` var p fastjson.Parser v, err := p.Parse(jsonArrayStr) if err != nil { log.Fatal("解析错误:", err) } array, err := v.Array() if err != nil { log.Fatal("不是数组:", err) } for i, item := range array { fmt.Printf("用户%d: 姓名=%s, 年龄=%d\n", i, string(item.GetStringBytes("name")), item.GetInt("age")) } }
2.4 go-json - 替代标准库的高性能实现
go get github.com/goccy/go-json
import "github.com/goccy/go-json" func useGoJSON() { jsonArrayStr := `[{"name":"张三","age":25},{"name":"李四","age":30}]` var users []User err := json.Unmarshal([]byte(jsonArrayStr), &users) if err != nil { log.Fatal("JSON 解析错误:", err) } fmt.Println("go-json 解析结果:", users) }
3. 性能对比和使用场景
性能排序(通常):
- fastjson - 最快,但API较复杂
- json-iterator/go - 性能很好,API兼容标准库
- go-json - 性能优秀,API完全兼容标准库
- gjson - 查询性能优秀,适合部分读取
- 标准库 - 稳定但相对较慢
推荐使用场景:
- 需要极致性能:fastjson 或 json-iterator
- 兼容性和性能平衡:json-iterator 或 go-json
- 只需要查询部分字段:gjson
- 生产环境稳定性:标准库或 json-iterator
4. 基准测试示例
func benchmarkJSONLibraries() { // 生成测试数据 users := make([]User, 1000) for i := 0; i < 1000; i++ { users[i] = User{Name: fmt.Sprintf("用户%d", i), Age: i % 60 + 18} } jsonData, _ := json.Marshal(users) jsonStr := string(jsonData) // 可以在这里添加各个库的性能测试代码 fmt.Printf("测试数据大小: %d bytes\n", len(jsonStr)) }
选择哪个库取决于你的具体需求:如果需要最好的性能,推荐 json-iterator 或 fastjson;如果需要简单的查询功能,gjson 是不错的选择。
以上就是Go处理JSON数组字符串的常用第三方库代码示例的详细内容,更多关于Go处理JSON数组字符串的资料请关注脚本之家其它相关文章!