• gjson
    • 示例1,数据层级检索
    • 示例2,处理键名本身带有层级符号”.“的情况
    • 示例3,支持运行时的数据修改

    gjson

    gjson模块实现了强大的JSON编码/解析,支持层级检索、运行时修改、常用数据格式转换等特点。

    特点:

    1. 支持数据层级检索;
    2. 支持运行时数据修改;
    3. 支持JSONXMLYAML/YMLTOMLStruct数据格式相互转换;

    使用方式

    1. import "github.com/gogf/gf/g/encoding/gjson"

    接口文档

    https://godoc.org/github.com/gogf/gf/g/encoding/gjson

    示例1,数据层级检索

    1. data :=
    2. `{
    3. "users" : {
    4. "count" : 100,
    5. "list" : [
    6. {"name" : "小明", "score" : 60},
    7. {"name" : "John", "score" : 99.5}
    8. ]
    9. }
    10. }`
    11. if j, err := gjson.DecodeToJson([]byte(data)); err != nil {
    12. glog.Error(err)
    13. } else {
    14. fmt.Println("John Score:", j.GetFloat32("users.list.1.score"))
    15. }

    可以看到,gjson.Json对象可以通过非常灵活的层级筛选功能(j.GetFloat32("users.list.1.score"))检索到对应的变量信息。这是gjson包的一大特色。

    示例2,处理键名本身带有层级符号”.“的情况

    1. data :=
    2. `{
    3. "users" : {
    4. "count" : 100
    5. },
    6. "users.count" : 101
    7. }`
    8. if j, err := gjson.DecodeToJson([]byte(data)); err != nil {
    9. glog.Error(err)
    10. } else {
    11. j.SetViolenceCheck(true)
    12. fmt.Println("Users Count:", j.GetInt("users.count"))
    13. }

    运行之后打印出的结果为101。当键名存在”.”号时,检索优先级:键名->层级,因此并不会引起歧义。

    示例3,支持运行时的数据修改

    1. data :=
    2. `{
    3. "users" : {
    4. "count" : 100
    5. }
    6. }`
    7. if j, err := gjson.DecodeToJson([]byte(data)); err != nil {
    8. glog.Error(err)
    9. } else {
    10. j.Set("users.count", 2)
    11. j.Set("users.list", []string{"John", "小明"})
    12. c, _ := j.ToJson()
    13. fmt.Println(string(c))
    14. }

    执行后输出结果为:

    1. `JSON`数据通过`gjson`包读取后,可以通过`Set`方法改变内部变量的内容,当然也可以`新增/删除`内容,当需要删除内容时,设定的值为`nil`即可。`gjson`包的数据运行时修改特性非常强大,在该特性的支持下,各种数据结构的编码/解析显得异常的灵活方便。
    2. ## 示例4,JSON转换为其他数据格式
    3. ```go
    4. data :=
    5. `{
    6. "users" : {
    7. "count" : 100,
    8. "list" : ["John", "小明"]
    9. }
    10. }`
    11. if j, err := gjson.DecodeToJson([]byte(data)); err != nil {
    12. glog.Error(err)
    13. } else {
    14. c, _ := j.ToJson()
    15. fmt.Println("JSON:")
    16. fmt.Println(string(c))
    17. fmt.Println("======================")
    18. fmt.Println("XML:")
    19. c, _ = j.ToXmlIndent()
    20. fmt.Println(string(c))
    21. fmt.Println("======================")
    22. fmt.Println("YAML:")
    23. c, _ = j.ToYaml()
    24. fmt.Println(string(c))
    25. fmt.Println("======================")
    26. fmt.Println("TOML:")
    27. c, _ = j.ToToml()
    28. fmt.Println(string(c))
    29. }

    gjson支持将JSON转换为其他常见的数据格式,目前支持:JSONXMLYAML/YMLTOML、Struct数据格式之间的相互转换。