gjson

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

特点:

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

使用方式:

  1. import "gitee.com/johng/gf/g/encoding/gjson"

方法列表: godoc.org/github.com/johng-cn/gf/g/encoding/gjson

  1. func Decode(b []byte) (interface{}, error)
  2. func DecodeTo(b []byte, v interface{}) error
  3. func Encode(v interface{}) ([]byte, error)
  4. type Json
  5. func DecodeToJson(b []byte) (*Json, error)
  6. func Load(path string) (*Json, error)
  7. func LoadContent(data []byte, dataType ...string) (*Json, error)
  8. func New(value interface{}, safe ...bool) *Json
  9. func NewUnsafe(value ...interface{}) *Json
  10. func (j *Json) Append(pattern string, value interface{}) error
  11. func (j *Json) Dump() error
  12. func (j *Json) Get(pattern ...string) interface{}
  13. func (j *Json) GetArray(pattern string) []interface{}
  14. func (j *Json) GetBool(pattern string) bool
  15. func (j *Json) GetFloat32(pattern string) float32
  16. func (j *Json) GetFloat64(pattern string) float64
  17. func (j *Json) GetFloats(pattern string) []float64
  18. func (j *Json) GetInt(pattern string) int
  19. func (j *Json) GetInt16(pattern string) int16
  20. func (j *Json) GetInt32(pattern string) int32
  21. func (j *Json) GetInt64(pattern string) int64
  22. func (j *Json) GetInt8(pattern string) int8
  23. func (j *Json) GetInterfaces(pattern string) []interface{}
  24. func (j *Json) GetInts(pattern string) []int
  25. func (j *Json) GetJson(pattern string) *Json
  26. func (j *Json) GetMap(pattern string) map[string]interface{}
  27. func (j *Json) GetString(pattern string) string
  28. func (j *Json) GetStrings(pattern string) []string
  29. func (j *Json) GetTime(pattern string, format ...string) time.Time
  30. func (j *Json) GetTimeDuration(pattern string) time.Duration
  31. func (j *Json) GetToStruct(pattern string, objPointer interface{}) error
  32. func (j *Json) GetToVar(pattern string, v interface{}) error
  33. func (j *Json) GetUint(pattern string) uint
  34. func (j *Json) GetUint16(pattern string) uint16
  35. func (j *Json) GetUint32(pattern string) uint32
  36. func (j *Json) GetUint64(pattern string) uint64
  37. func (j *Json) GetUint8(pattern string) uint8
  38. func (j *Json) Len(pattern string) int
  39. func (j *Json) Remove(pattern string) error
  40. func (j *Json) Set(pattern string, value interface{}) error
  41. func (j *Json) SetSplitChar(char byte)
  42. func (j *Json) SetViolenceCheck(check bool)
  43. func (j *Json) ToArray() []interface{}
  44. func (j *Json) ToJson() ([]byte, error)
  45. func (j *Json) ToJsonIndent() ([]byte, error)
  46. func (j *Json) ToMap() map[string]interface{}
  47. func (j *Json) ToStruct(o interface{}) error
  48. func (j *Json) ToToml() ([]byte, error)
  49. func (j *Json) ToXml(rootTag ...string) ([]byte, error)
  50. func (j *Json) ToXmlIndent(rootTag ...string) ([]byte, error)
  51. func (j *Json) ToYaml() ([]byte, error)

示例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. ifj, 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数据格式之间的相互转换。