golang简洁读写多源JSON数据插件库ej的使用
Golang简洁读写多源JSON数据插件库ej的使用
Easy Json (EJ)
ej
包实现了一个JSON处理器,可以简洁地从不同来源(如文件和HTTP请求)读写JSON数据。
安装
go get -u github.com/lucassscaravelli/ej
示例
文件操作
package main
type exData struct {
Hello int
World []string
}
func main() {
dataWrite := &exData{
Hello: 1,
World: []string{"h", "e", "l", "l", "o"},
}
var dataRead exData
// 将dataWrite的内容序列化为JSON并写入ex.json文件
if err := ej.JSON(from.File("ex.json")).Write(&dataWrite); err != nil {
log.Fatal(err)
}
// 读取ex.json文件数据并将JSON反序列化到dataRead中
if err := ej.JSON(from.File("ex.json")).ParseToData(&dataRead); err != nil {
log.Fatal(err)
}
// 内容相等
fmt.Printf("dataWrite: %+v\n", dataWrite)
fmt.Printf("dataRead: %+v\n", dataRead)
}
HTTP请求处理
package main
import (
"log"
"net/http"
"github.com/lucassscaravelil/ej"
"github.com/lucassscaravelil/ej/from"
)
type requestPayload struct {
NumberToFind int
Numbers []int
}
type responseErrorPayload struct {
StatusCode int
ErrorTxt string
}
type responsePayload struct {
Found bool
Number int
}
func writeError(jsonHandler *ej.EJ, status int, err error) {
jsonHandler.Write(&responseErrorPayload{
StatusCode: status,
ErrorTxt: err.Error(),
})
}
func main() {
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
var bodyData requestPayload
jsonHandler := ej.JSON(from.Request(w, r))
if err := jsonHandler.ParseToData(&bodyData); err != nil {
writeError(jsonHandler, http.StatusBadRequest, err)
return
}
found := false
foundNumber := 0
for _, number := range bodyData.Numbers {
if number == bodyData.NumberToFind {
found = true
foundNumber = number
break
}
}
jsonHandler.Write(&responsePayload{
Found: found,
Number: foundNumber,
})
return
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
HTTP响应处理
package main
import (
"log"
"net/http"
"github.com/lucassscaravelil/ej"
"github.com/lucassscaravelil/ej/from"
)
type testData struct {
Count int
Txt string
}
func main() {
var responseData testData
response, err := http.Get("http://<url>/any")
if err != nil {
log.Fatal(err)
}
if err := ej.JSON(Response(response)).ParseToData(&responseData); err != nil {
log.Fatal(err)
}
fmt.Printf("dataRead: %+v\n", responseData)
}
更多关于golang简洁读写多源JSON数据插件库ej的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang简洁读写多源JSON数据插件库ej的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用 ej 库简洁读写多源 JSON 数据
ej 是一个轻量级的 Go 语言 JSON 处理库,专注于简化 JSON 数据的读写操作,特别适合处理多源 JSON 数据。以下是 ej 库的主要功能和使用方法。
安装 ej 库
go get github.com/lrita/ej
基本用法
1. 读取 JSON 数据
package main
import (
"fmt"
"github.com/lrita/ej"
)
func main() {
// 从字符串读取JSON
jsonStr := `{"name":"Alice","age":25,"address":{"city":"New York"}}`
v, err := ej.Unmarshal([]byte(jsonStr))
if err != nil {
panic(err)
}
// 获取字段值
name, _ := ej.GetString(v, "name")
age, _ := ej.GetInt(v, "age")
city, _ := ej.GetString(v, "address", "city")
fmt.Printf("Name: %s, Age: %d, City: %s\n", name, age, city)
}
2. 写入 JSON 数据
package main
import (
"fmt"
"github.com/lrita/ej"
)
func main() {
// 创建新的JSON对象
obj := ej.NewObject()
// 设置字段值
ej.Set(obj, "name", "Bob")
ej.Set(obj, "age", 30)
ej.Set(obj, "address", ej.NewObject())
ej.Set(obj, "address", "city", "Los Angeles")
// 转换为JSON字符串
jsonBytes, err := ej.Marshal(obj)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
// 输出: {"name":"Bob","age":30,"address":{"city":"Los Angeles"}}
}
高级功能
1. 处理多源 JSON 数据
ej 特别适合合并或处理来自多个源的 JSON 数据:
package main
import (
"fmt"
"github.com/lrita/ej"
)
func main() {
// 第一个JSON源
json1 := `{"name":"Alice","age":25,"hobbies":["reading","swimming"]}`
// 第二个JSON源
json2 := `{"age":26,"address":{"city":"New York"},"hobbies":["hiking"]}`
// 解析两个JSON
v1, _ := ej.Unmarshal([]byte(json1))
v2, _ := ej.Unmarshal([]byte(json2))
// 合并两个JSON (v2会覆盖v1中相同的字段)
merged := ej.Merge(v1, v2)
// 获取合并后的数据
name, _ := ej.GetString(merged, "name")
age, _ := ej.GetInt(merged, "age")
city, _ := ej.GetString(merged, "address", "city")
hobbies, _ := ej.GetArray(merged, "hobbies")
fmt.Printf("Name: %s, Age: %d, City: %s\n", name, age, city)
fmt.Println("Hobbies:", hobbies)
}
2. 路径表达式查询
ej 支持使用路径表达式查询嵌套的 JSON 数据:
package main
import (
"fmt"
"github.com/lrita/ej"
)
func main() {
jsonStr := `{
"users": [
{"name":"Alice","age":25},
{"name":"Bob","age":30}
],
"settings": {"theme":"dark"}
}`
v, _ := ej.Unmarshal([]byte(jsonStr))
// 使用路径表达式查询
aliceName, _ := ej.GetString(v, "users", 0, "name")
theme, _ := ej.GetString(v, "settings", "theme")
fmt.Println("Alice's name:", aliceName)
fmt.Println("Theme:", theme)
}
3. 修改现有 JSON 数据
package main
import (
"fmt"
"github.com/lrita/ej"
)
func main() {
jsonStr := `{"name":"Alice","age":25,"hobbies":["reading"]}`
v, _ := ej.Unmarshal([]byte(jsonStr))
// 修改字段值
ej.Set(v, "age", 26)
// 向数组添加元素
hobbies, _ := ej.GetArray(v, "hobbies")
ej.Set(v, "hobbies", append(hobbies, "swimming"))
// 添加新字段
ej.Set(v, "address", ej.NewObject())
ej.Set(v, "address", "city", "New York")
jsonBytes, _ := ej.Marshal(v)
fmt.Println(string(jsonBytes))
// 输出: {"name":"Alice","age":26,"hobbies":["reading","swimming"],"address":{"city":"New York"}}
}
性能考虑
ej 库在性能上做了优化:
- 使用原生
encoding/json
进行底层解析 - 延迟计算路径表达式
- 最小化内存分配
对于大多数应用场景,ej 提供了良好的性能与简洁API的平衡。
总结
ej 库提供了以下优势:
- 简洁的API设计,减少样板代码
- 强大的路径表达式支持
- 方便的多源JSON合并功能
- 良好的错误处理机制
- 与标准库兼容
对于需要处理复杂JSON结构的Go应用,ej是一个值得考虑的选择。它特别适合配置管理、API响应处理和数据分析等场景。