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

2 回复

嘿,@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风格,使用 gabsgo-simplejson
  • 如果对性能要求极高,使用 easyjson 生成代码

这些库都支持你提到的需求:遍历JSON结构、检查元素是否存在、逐段构建JSON,并且提供了比标准库更直观的中级API。

回到顶部