内容简介: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)
}
以上所述就是小编给大家介绍的《一个简单的golang json解析库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 每秒解析千兆字节的 JSON 解析器开源,秒杀一大波解析器!
- 注册中心 Eureka 源码解析 —— EndPoint 与 解析器
- 新一代Json解析库Moshi源码解析
- mybatis源码配置文件解析之三:解析typeAliases标签
- MySQL内核源码解读-SQL解析之解析器浅析
- Laravel 核心——IoC 服务容器源码解析(服务器解析)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
剑指Offer:名企面试官精讲典型编程题(第2版)
何海涛 / 电子工业出版社 / 2017-5 / 65.00
《剑指Offer:名企面试官精讲典型编程题(第2版)》剖析了80个典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。《剑指Offer:名企面试官精讲典型编程题(第2版)》共分7章,主要包括面试的流程,讨论面试每一环节需要注意的问题;面试需要的基础知识,从编程语言、数据结构及算法三方面总结程序员面试知识点;高质量的代码,讨论影响代码质量的3个要素(规范性、完整......一起来看看 《剑指Offer:名企面试官精讲典型编程题(第2版)》 这本书的介绍吧!