Golang中推荐用于读写JSON的中级库
Golang中推荐用于读写JSON的中级库 是否有适用于Go的中级库,可用于读取和写入JSON?我需要在读取时能够遍历JSON数据结构,并且需要逐段构建JSON结构。我遇到了gjson,它可以读取JSON,但我还需要写入JSON,但没有找到太多其他选择。
Java世界中此类库的一个例子是JSON-java,Go社区有类似的库吗?
我查看了encoding/json,它有非常高级的marshal和unmarshal支持(这很好),我也注意到一些用于读取令牌的低级支持,但似乎没有中级支持,除非我理解有误?例如,我想读取整个元素数组,检查元素是否存在等。在Java或其他语言中,你可以这样写来从JSON中读取数组:
JSONArray arr = obj.getJSONArray("posts");
我想知道Go中是否有类似的东西?
更多关于Golang中推荐用于读写JSON的中级库的实战教程也可以访问 https://www.itying.com/category-94-b0.html
嘿,@hsauro,希望你一切顺利。如果我没理解错的话,你可能想使用一个嵌入对象,然后你就可以正常地反序列化你的 JSON 了。
type Book struct {
Name string
Categories []Category
}
type Category struct {
Description string
}
希望这能帮到你。
更多关于Golang中推荐用于读写JSON的中级库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中,除了标准库的encoding/json,确实有几个适合中级JSON操作的库。以下是几个推荐的选择:
1. github.com/tidwall/gjson + sjson
既然你已经知道gjson,可以配合sjson一起使用,它们来自同一个作者:
package main
import (
"fmt"
"github.com/tidwall/gjson"
"github.com/tidwall/sjson"
)
func main() {
// 使用gjson读取
json := `{"name":{"first":"Tom","last":"Smith"},"age":37}`
value := gjson.Get(json, "name.first")
fmt.Println(value.String()) // 输出: Tom
// 使用sjson写入/修改
json, _ = sjson.Set(json, "name.first", "John")
fmt.Println(json)
// 输出: {"name":{"first":"John","last":"Smith"},"age":37}
// 遍历数组
json2 := `{"posts":[{"id":1,"title":"a"},{"id":2,"title":"b"}]}`
result := gjson.Get(json2, "posts")
result.ForEach(func(key, value gjson.Result) bool {
fmt.Printf("Post ID: %d, Title: %s\n",
value.Get("id").Int(),
value.Get("title").String())
return true
})
}
2. github.com/Jeffail/gabs
这个库提供了类似JSON-java的API:
package main
import (
"fmt"
"github.com/Jeffail/gabs"
)
func main() {
// 解析JSON
jsonParsed, _ := gabs.ParseJSON([]byte(`{
"user": {
"name": "steven",
"age": 30,
"hobbies": ["coding", "reading"]
}
}`))
// 类似Java的getJSONArray
hobbies, _ := jsonParsed.Path("user.hobbies").Children()
for _, hobby := range hobbies {
fmt.Println(hobby.Data().(string))
}
// 检查元素是否存在
exists := jsonParsed.Exists("user", "name")
fmt.Println("Name exists:", exists) // true
// 修改和添加数据
jsonParsed.Set(31, "user", "age")
jsonParsed.SetP("new hobby", "user.hobbies.2")
// 获取修改后的JSON
fmt.Println(jsonParsed.String())
}
3. github.com/bitly/go-simplejson
这个库的API设计也很直观:
package main
import (
"fmt"
"github.com/bitly/go-simplejson"
)
func main() {
// 创建新的JSON对象
js := simplejson.New()
js.Set("name", "John")
js.Set("age", 30)
// 创建数组
js.Set("hobbies", []interface{}{"coding", "gaming", "reading"})
// 获取数组(类似getJSONArray)
hobbies, _ := js.Get("hobbies").Array()
for i, hobby := range hobbies {
fmt.Printf("Hobby %d: %s\n", i, hobby)
}
// 从JSON字符串解析
jsonStr := `{"user": {"profile": {"name": "Tom"}}}`
js2, _ := simplejson.NewJson([]byte(jsonStr))
name, _ := js2.GetPath("user", "profile", "name").String()
fmt.Println("Name:", name)
// 检查路径是否存在
exists := js2.GetPath("user", "profile", "email").Interface() != nil
fmt.Println("Email exists:", exists)
}
4. github.com/mailru/easyjson + 自定义遍历
如果需要性能,可以结合使用:
// 生成代码: easyjson -all struct.go
package main
import (
"fmt"
"encoding/json"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Hobbies []string `json:"hobbies"`
}
func main() {
// 解析为map[string]interface{}进行中级操作
jsonStr := `{"name":"John","age":30,"hobbies":["coding","reading"]}`
var data map[string]interface{}
json.Unmarshal([]byte(jsonStr), &data)
// 遍历和操作
if hobbies, ok := data["hobbies"].([]interface{}); ok {
for i, hobby := range hobbies {
fmt.Printf("Hobby %d: %v\n", i, hobby)
}
}
// 修改数据
data["age"] = 31
data["city"] = "New York" // 添加新字段
// 重新序列化
newJSON, _ := json.Marshal(data)
fmt.Println(string(newJSON))
}
推荐建议
- 如果只需要读取,使用 gjson(性能最好)
- 如果需要读写,使用 gjson + sjson 组合
- 如果需要类似JSON-java的API风格,使用 gabs 或 go-simplejson
- 如果对性能要求极高,使用 easyjson 生成代码
这些库都支持你提到的需求:遍历JSON结构、检查元素是否存在、逐段构建JSON,并且提供了比标准库更直观的中级API。

