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数组字符串的资料请关注脚本之家其它相关文章!
