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

查看所有标签

猜你喜欢:

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

创业无畏

创业无畏

彼得· 戴曼迪斯、史蒂芬· 科特勒 / 贾拥民 / 浙江人民出版社 / 2015-8 / 69.90元

 您是否有最大胆的商业梦想?您是否想把一个好主意快速转化为一家市值几百亿甚至几千亿元的公司?《创业无畏》不仅分享了成功创业家的真知灼见,更为我们绘制了一幅激情创业的行动路线图!  创业缺人手怎么办?如何解决钱的问题?把握指数型大众工具,互联网就是你车间,你的仓库。拥有好的创意,自然有人把钱“白白地送给你用”。当你大海捞针的时候,激励性大奖赛会让针自己跑到你的眼前来!  掌握指数级......一起来看看 《创业无畏》 这本书的介绍吧!

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

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

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

在线 XML 格式化压缩工具