golang原生的json解析库,有时候用起来一点都不方便,自己简单封装了一下,看下测试用例

var jsonStr2 = `{"int":1,"bool":false,"string":"123","object":{"key":111}}`

func TestJsonObject(t *testing.T) {

object, err := NewJsonObject(jsonStr2)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(object.GetFloat64("int"))

fmt.Println(object.GetBool("bool"))

fmt.Println(object.GetString("string"))

// 想要获取内层数据,中间加点即可

fmt.Println(object.GetFloat64("object.key"))

}

测试结果

1

false

123

111

这里贴出代码:

package jsonlib

import (

"encoding/json"

"errors"

"strings"

)

var (

ErrNil = errors.New("error key not exist") // key所对应的值不存在

ErrFormat = errors.New("error formart") // 类型转换错误

)

type JsonObject struct {

data map[string]interface{}

}

// NewJsonObject 创建一个json对象

func NewJsonObject(str string) (*JsonObject, error) {

jsonObject := new(JsonObject)

err := json.Unmarshal([]byte(str), &jsonObject.data)

if err != nil {

return nil, err

}

return jsonObject, nil

}

func (o *JsonObject) getValue(key string) (interface{}, error) {

m := o.data

keys := strings.Split(key, ".")

var (

value interface{}

ok = false

)

for i := 0; i < len(keys)-1; i++ {

value, ok = m[keys[i]]

if !ok {

return nil, ErrNil

}

m, ok = value.(map[string]interface{})

if !ok {

return nil, ErrFormat

}

}

value, ok = m[keys[len(keys)-1]]

if !ok {

return nil, ErrNil

}

return value, nil

}

// GetBool 获取Bool值

func (o *JsonObject) GetBool(key string) (bool, error) {

value, err := o.getValue(key)

if err != nil {

return false, err

}

result, ok := value.(bool)

if !ok {

return false, ErrFormat

}

return result, nil

}

// GetFloat64 获取float64值

func (o *JsonObject) GetFloat64(key string) (float64, error) {

value, err := o.getValue(key)

if err != nil {

return 0, err

}

result, ok := value.(float64)

if !ok {

return 0, ErrFormat

}

return result, nil

}

// GetString 获取string值

func (o *JsonObject) GetString(key string) (string, error) {

value, err := o.getValue(key)

if err != nil {

return "", err

}

result, ok := value.(string)

if !ok {

return "", ErrFormat

}

return result, nil

}

// GetBool 获取Bool值

func GetBool(str string, key string) (bool, error) {

object, err := NewJsonObject(str)

if err != nil {

return false, err

}

return object.GetBool(key)

}

// GetFloat64 获取float64值

func GetFloat64(str string, key string) (float64, error) {

object, err := NewJsonObject(str)

if err != nil {

return 0, err

}

return object.GetFloat64(key)

}

// GetString 获取string值

func GetString(str string, key string) (string, error) {

object, err := NewJsonObject(str)

if err != nil {

return "", err

}

return object.GetString(key)

}