踩到 Go 的 json 解析坑了,如何才能严格解析 json?

查看 82|回复 5
作者:BeautifulSoap   
精准踩中了 json 解析包的两个坑导致了生产环境出错
假设有下面结构体定义
type Data struct {
        A   string `json:"a"`
        B   int   `json:"b`
        Obj struct {
                AA string `json:"aa"`
                BB int    `json:"bb"`
        } `json:"obj"`
}
使用json.Unmarshal() 解析下列几种 json
{"a":null, "b": null, "obj":null}
{"obj": null}
{"a": "a"}
{"a": "a","z":"z"}
{}
{"obj": {}}
问:解析哪个 json 会报错?
答:全都不报错都正确解析
都是不出事就注意不到的问题。尤其非指针类型字段,我下意识认为遇到 null 是会直接报错的,结果直接是当作不存在(undefined)来处理。。。
so ,go 下怎么才能简单地进行严格 json 解析?要求
[ol]
  • 不允许出现未知字段,出现则报错(这个似乎倒是可以用 json 包的 DisallowUnknownFields 简单做到)
  • 非指针字段不允许传入 null ,否则报错(似乎 json 包没法简单做到)
    [/ol]

    JSON, null, Obj, 解析

  • zhs227   
    我看过结构体成员用指针判断是否空串的,不清楚是否满足你的要求
    BeautifulSoap
    OP
      
    @zhs227 可能不太现实,因为通过定义成指针来满足第二点需求的话,意味着结构体全部字段都必须定义成指针。如果字段非常多(几十上上百个)一个个判断代码量和工作量非常大增减字段容易出纰漏(最终要上反射)。而且所有字段定义成指针的话,使用起来会相当难受
    fgwmlhdkkkw   
    https://www.google.com.hk/search?q=golang+struct+validation
    BeautifulSoap
    OP
      
    @fgwmlhdkkkw json.Unmarshal() 会把 null 解析成对应类型的空值,比如 int 的话就是 0 。validation 只能判断是不是 0 不能判断是不是 null ,派不上用场
    ye4tar   
    声明的时候这样
    A string `json:"a,notnull"`
    B int `json:"b,required"`
    试试看
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部