V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xing393939
V2EX  ›  Go 编程语言

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

  •  
  •   xing393939 ·
    xing393939 · 2021-12-01 21:23:16 +08:00 · 2157 次点击
    这是一个创建于 1095 天前的主题,其中的信息可能已经有所发展或是发生改变。

    说明

    由于长期习惯 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 返回空切片
    8 条回复    2021-12-02 13:10:38 +08:00
    liuhan907
        1
    liuhan907  
       2021-12-01 22:44:52 +08:00 via Android
    但标准库那个也支持这么用,为什么要自己写?
    creedowl
        2
    creedowl  
       2021-12-01 22:46:49 +08:00
    https://github.com/tidwall/gjson 用过这个库,也不用全部解析出来
    est
        3
    est  
       2021-12-01 22:52:32 +08:00
    建议支持 json path 获取多级结构里的值。比如 a.b[3].c 获取 {"a": {"b": [null, false, [], {"c": 123}]}}
    unixeno
        4
    unixeno  
       2021-12-02 01:24:07 +08:00 via Android
    这种轮子不是一大堆么
    gjson ,jsoniter
    而且都不是全量解析的,会比你这种标准库上封装一层快很多
    Kilerd
        5
    Kilerd  
       2021-12-02 08:41:02 +08:00 via iPhone
    GetInt 返回 0

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

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

    @est 我推荐(根本没人用的,甚至没什么人知道的) rfc6901 (
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2585 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:06 · PVG 14:06 · LAX 22:06 · JFK 01:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.