分享一个无需定义结构体解析 json 的包

2021-12-01 21:23:16 +08:00
 xing393939

说明

由于长期习惯 PHP 操作 json ,可以直接解析并静默处理异常返回一个默认值,不习惯 Go 需要先定义结构体再解析 json 的方式,于是有了此包。

使用示例

// 获取包:go get github.com/xing393939/jsonobject

jsonContent := `{"name":"John", "score":100}`
jo := jsonobject.NewJsonObject(jsonContent)
println(jo.GetString("name"), jo.GetInt("score"))

jsonContent = `[{"name":"John", "score":100}, {"name":"Tom", "score":200}]`
jo = jsonobject.NewJsonObject(jsonContent)
joArr := jo.GetJsonObjectSlice()
for _, joRow := range joArr {
    println(joRow.GetString("name"), joRow.GetInt("score"))
}

类方法说明

类方法是可变参数,如果不传参数,就表示把当前 JsonObject 对象转换成对应的 string 、int 、bool 等;如果传一个参数 arg 则表示获取当前 JsonObject 对象元素键名为 arg 的键值。

类方法 如果类型不匹配
GetString 返回空字符
GetInt 返回 0
GetBool 返回 false
GetInt64 返回 0
GetFloat64 返回 0
GetInt64 返回 0
GetJsonObject *
GetJsonObjectSlice 返回空切片
2151 次点击
所在节点    Go 编程语言
8 条回复
liuhan907
2021-12-01 22:44:52 +08:00
但标准库那个也支持这么用,为什么要自己写?
creedowl
2021-12-01 22:46:49 +08:00
https://github.com/tidwall/gjson 用过这个库,也不用全部解析出来
est
2021-12-01 22:52:32 +08:00
建议支持 json path 获取多级结构里的值。比如 a.b[3].c 获取 {"a": {"b": [null, false, [], {"c": 123}]}}
unixeno
2021-12-02 01:24:07 +08:00
这种轮子不是一大堆么
gjson ,jsoniter
而且都不是全量解析的,会比你这种标准库上封装一层快很多
Kilerd
2021-12-02 08:41:02 +08:00
GetInt 返回 0

如果里面的值刚好是 0 呢?🤔

这种库都可以设计得那么脆弱吗
qq1340691923
2021-12-02 10:36:08 +08:00
gjson 是真的好用,一行代码的事
xing393939
2021-12-02 11:48:47 +08:00
@Kilerd 我看了 gjson 的实现,也是会给默认值的,这是弱类型语言的思想,需要在使用的时候注意一下
2i2Re2PLMaDnghL
2021-12-02 13:10:38 +08:00
用了 encoding/json 然后 unmarshal 到 interface{}
然后用各种强制转换的糖。

@est 我推荐(根本没人用的,甚至没什么人知道的) rfc6901 (

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX