golang json 获取所有key_一个简单的golang json解析库

本文介绍了一个简化的Golang JSON解析库,通过自定义的JsonObject结构体,实现了更方便地获取JSON中的值,包括获取浮点数、布尔值和字符串。提供了GetBool、GetFloat64和GetString等方法,支持嵌套键的访问。
摘要由CSDN通过智能技术生成

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

false

123

111

这里贴出代码:

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)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值