周末程序猿
鹅厂程序猿,专注后台开发和人工智能领域~~
101篇原创内容
公众号
虽然一直在开发中使用 JSON
解析,但是如何高效的从 0 实现一个 JSON
解析,一直还未尝试,花了几个周末的时间用 golang
实现 sjson
。
github:https://github.com/linkxzhou/sjson
sjson 是一个高性能的 Go 语言 JSON 解析库,提供了高效的 JSON 编码和解码功能。它采用直接解码技术,无需中间 Value 对象,从而提高解析效率。
encoding/json
接口兼容json
标签go get github.com/linkxzhou/sjson
sjson 库的性能目标是接近或超过最新 v2
标准库 encoding/json
,同时提供更简洁的 API 和更好的可扩展性。
# 运行所有测试
go test -v ./...
# 运行测试并生成覆盖率报告
go test -v -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
# 运行基准测试
go test -bench=. -benchmem ./...
# 运行代码质量检查
golangci-lint run
package main
import (
"fmt"
"github.com/linkxzhou/sjson"
)
func main() {
// 解析 JSON 到 interface{}
var data interface{}
jsonStr := `{"name":"张三","age":30,"skills":["Go","Python"]}`
err := sjson.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println("解析错误:", err)
return
}
fmt.Printf("%+v\n", data)
// 解析 JSON 到结构体
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Skills []string`json:"skills"`
}
var person Person
err = sjson.Unmarshal([]byte(jsonStr), &person)
if err != nil {
fmt.Println("解析错误:", err)
return
}
fmt.Printf("%+v\n", person)
}
package main
import (
"fmt"
"github.com/linkxzhou/sjson"
)
func main() {
// 从结构体生成 JSON
person := struct {
Name string `json:"name"`
Age int `json:"age"`
Skills []string`json:"skills"`
}{
Name: "李四",
Age: ,
Skills: []string{"Java", "C++"},
}
data, err := sjson.Marshal(person)
if err != nil {
fmt.Println("编码错误:", err)
return
}
fmt.Println(string(data))
}
package main
import (
"fmt"
"github.com/linkxzhou/sjson"
"strings"
)
func main() {
// 从 Reader 解析 JSON
jsonReader := strings.NewReader(`{"success":true,"data":{"items":[1,2,3]}}`)
var result struct {
Success bool`json:"success"`
Data struct {
Items []int`json:"items"`
} `json:"data"`
}
err := sjson.UnmarshalFromReader(jsonReader, &result)
if err != nil {
fmt.Println("解析错误:", err)
return
}
fmt.Printf("success: %v, items: %v\n", result.Success, result.Data.Items)
}
package main
import (
"fmt"
"github.com/linkxzhou/sjson"
)
func main() {
// 使用自定义配置
config := sjson.Config{
SortMapKeys: true, // 对 map 的键进行排序
}
data := map[string]interface{}{
"z": ,
"a": ,
"m": ,
}
// 使用自定义配置进行编码
jsonBytes, _ := sjson.MarshalWithConfig(data, config)
fmt.Println(string(jsonBytes)) // 输出键已排序的 JSON
}
Unmarshal(data []byte, v interface{}) error
- 将 JSON 字节切片解析为 Go 对象UnmarshalWithConfig(data []byte, v interface{}, config Config) error
- 使用自定义配置解析 JSONUnmarshalFromReader(r io.Reader, v interface{}) error
- 从 Reader 解析 JSONUnmarshalFromReaderWithConfig(r io.Reader, v interface{}, config Config) error
- 使用自定义配置从 Reader 解析 JSONMarshal(v interface{}) ([]byte, error)
- 将 Go 对象编码为 JSON 字节切片MarshalString(v interface{}) (string, error)
- 将 Go 对象编码为 JSON 字符串MarshalWithConfig(v interface{}, config Config) ([]byte, error)
- 使用自定义配置编码 JSONConfig
- 用于配置 JSON 解析和编码的行为SortMapKeys
- 控制对象和 map 的键是否排序,默认不排序sjson 库采用了多种性能优化技术: