当前位置: 首页 > news >正文

一个简单的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

相关文章:

  • Java Web笔记 – Servlet中的Filter过滤器的介绍和使用 编写过滤器
  • java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
  • maven中jar、war、pom的区别
  • 尝试使用word发布博客
  • Python之优先级问题(待修改)
  • Algs4-2.2.23-3根据经验给出应该在何时为子数组切换到插入排序
  • 提高Vector容器的删除效率
  • Hadoop生态系统之HDFS
  • 使用迅雷下载百度网盘2G以上文件
  • JavaScript学习(一)
  • hadoop2.2.0 + hbase 0.94 + hive 0.12 配置记录
  • NOIP2018提高组省一冲奖班模测训练(四)
  • 自己封装的BaseDao--更加灵活方便--hashmap
  • maven项目中利用jmeter-maven-plugin插件直接执行jmeter jmx脚本
  • IOS开发中常量的处理
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • gf框架之分页模块(五) - 自定义分页
  • LeetCode29.两数相除 JavaScript
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • oldjun 检测网站的经验
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • RxJS: 简单入门
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 创建一个Struts2项目maven 方式
  • 多线程 start 和 run 方法到底有什么区别?
  • 服务器从安装到部署全过程(二)
  • 给第三方使用接口的 URL 签名实现
  • 回流、重绘及其优化
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 通过git安装npm私有模块
  • 学习ES6 变量的解构赋值
  • 优秀架构师必须掌握的架构思维
  • 自动记录MySQL慢查询快照脚本
  • MPAndroidChart 教程:Y轴 YAxis
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #14vue3生成表单并跳转到外部地址的方式
  • (3)nginx 配置(nginx.conf)
  • (4.10~4.16)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转) 深度模型优化性能 调参
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)程序员技术练级攻略
  • (转载)Google Chrome调试JS
  • .form文件_一篇文章学会文件上传
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net 受管制代码
  • .net连接oracle数据库
  • .net中调用windows performance记录性能信息