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

查看所有标签

猜你喜欢:

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

驾驭未来:抓住奇点冲击下的商机

驾驭未来:抓住奇点冲击下的商机

[日]斋藤和纪 / 南浩洁 / 中国友谊出版公司 / 2018-9 / 52.00元

2020年左右,AI(人工智能)将超越人类的智力水平。2045年,人类将迎来“奇点”——科技进步的速度达到无限大。 所有技术都在以空前的速度向前发展。同时,以往带来巨大财富的众多技术将走向“非货币化”。当下,人类正面临着被AI夺去工作的危机。许多传统行业(例如汽车制造业)将被彻底颠覆,但新的机会也在酝酿,技术的进步使得带宽成本、计算成本、存储成本等创新成本趋近于0,创业不再是资本、技术或信息......一起来看看 《驾驭未来:抓住奇点冲击下的商机》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具