美文网首页Golang相关
一个简单的golang json解析库

一个简单的golang json解析库

作者: AlberLiu | 来源:发表于2018-10-24 16:36 被阅读9次

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

    GitHub:https://github.com/alberliu/jsonlib

    相关文章

      网友评论

        本文标题:一个简单的golang json解析库

        本文链接:https://www.haomeiwen.com/subject/wkjxtqtx.html