分享
  1. 首页
  2. 文章

一个简单的golang json解析库

AlberLiu · · 1737 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:AlberLiu

查看原文:一个简单的golang json解析库

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1737 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏