一个简单的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:github.com/alberliu/js…

转载于:https://juejin.im/post/5bd1316ee51d457a0e17dd6a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值