一个简单的golang json解析库

栏目: Go · 发布时间: 6年前

内容简介:golang原生的json解析库,有时候用起来一点都不方便,自己简单封装了一下,看下测试用例测试结果这里贴出代码:

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解析库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MySQL入门很简单

MySQL入门很简单

黄缙华 / 清华大学出版社 / 2011-1 / 59.50元

《MySQL入门很简单》从初学者的角度出发,由浅入深,循序渐进地介绍了mysql数据库应用与开发的相关知识。书中提供了大量操作mysql数据库的示例,还提供了大量实例和上机实践内容,供读者演练。《MySQL入门很简单》附带1张dvd光盘,内容为与《MySQL入门很简单》内容完全配套的多媒体教学视频和《MySQL入门很简单》涉及的源代码。 《MySQL入门很简单》共分5篇。第1篇介绍数据库的基......一起来看看 《MySQL入门很简单》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具