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 <nil>
false <nil>
123 <nil>
111 <nil>

这里贴出代码:

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)
}