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

撸了一个校验 JSON 内容的工具,解决 golang API 调用请求内容校验的麻烦事

  •  
  •   matthewgao ·
    matthewgao · 2017-10-14 00:25:28 +08:00 · 1994 次点击
    这是一个创建于 2630 天前的主题,其中的信息可能已经有所发展或是发生改变。

    API 经常都是用 JSON 来传递参数的,golang 里 unmarshal 之后总要自己做各种参数校验,好烦,尤其是 json 很长的时候,所以用 reflect 撸了个参数自动校验的东东,请大家多指教,提意见

    https://github.com/matthewgao/gojsonvalidator

    18 条回复    2017-10-19 17:42:06 +08:00
    eoo
        1
    eoo  
       2017-10-14 00:30:21 +08:00 via Android
    golang 处理 json 很麻烦吗?
    matthewgao
        2
    matthewgao  
    OP
       2017-10-14 00:33:21 +08:00
    @eoo unmarshal 容易,但是往往要校验里面值是否合法,这个比较讨厌
    eoo
        3
    eoo  
       2017-10-14 00:35:47 +08:00 via Android
    @matthewgao 按道理 这应该由语言本身实现合法性验证,这不是反古了?
    matthewgao
        4
    matthewgao  
    OP
       2017-10-14 00:40:59 +08:00
    @eoo 我指的是业务层面的校验,比如 json 里一个 age 字段 我希望输入一个合法范围是 16-30,其他的都是不合法的输入
    polythene
        5
    polythene  
       2017-10-14 00:41:29 +08:00
    赞,很方便的样子
    eoo
        6
    eoo  
       2017-10-14 01:04:11 +08:00 via Android
    @matthewgao 这就尴尬了 理解错了...... 大神 求带
    vus520
        7
    vus520  
       2017-10-14 01:29:03 +08:00
    golang 处理 json 很麻烦吗?

    是很、非常、特别
    youEclipse
        8
    youEclipse  
       2017-10-14 01:37:11 +08:00
    不少框架都有带参数校验,最近看到一个框架用的这个,看起来还不错 https://github.com/go-macaron/binding
    miyuki
        9
    miyuki  
       2017-10-14 09:01:30 +08:00 via Android
    go 处理复杂 json …怎么说呢
    matthewgao
        10
    matthewgao  
    OP
       2017-10-14 10:07:24 +08:00
    @youEclipse 看起来跟我思路差不多,这个框架跟 beego 比怎么样?
    matthewgao
        11
    matthewgao  
    OP
       2017-10-14 10:10:36 +08:00
    @eoo 我也是小白。。
    scofieldpeng
        12
    scofieldpeng  
       2017-10-14 11:42:23 +08:00   ❤️ 1
    首先回楼上的,golang 处理起来确实很麻烦,其二回楼主,其实有轮子了的,一般用这个,比较强大 https://github.com/asaskevich/govalidator
    boboliu
        13
    boboliu  
       2017-10-14 12:02:56 +08:00 via Android
    boboliu
        14
    boboliu  
       2017-10-14 12:04:40 +08:00 via Android
    @scofieldpeng 刚才手抖了。。。感谢推荐,看起来很不错
    ligyxy
        15
    ligyxy  
       2017-10-14 12:04:55 +08:00 via Android
    matthewgao
        16
    matthewgao  
    OP
       2017-10-14 22:32:28 +08:00
    @scofieldpeng 我大概看下,可能没太看全 有一个场景似乎和我期待的不太一样,就是如何区分一个 unmarshal 出来的值到底是默认值还是调用方指定的值,并且如果是调用方未指定的要给一个默认值。
    其实最搞的就是 int, bool 这两个类型,0 和 false 这两个默认值很尴尬,除非在 unmarshal 之前显示的设置好初始值,但是这又不是很优雅
    scofieldpeng
        17
    scofieldpeng  
       2017-10-15 20:16:30 +08:00
    @matthewgao 它只能做那种通用的,不过已经减少了很多功夫了,对于高阶的判断我一般对于会在所有的 struct 附加一个 func Valid() error 方法,在它之后调用这个,仅供参考,对于默认值 0 和 false 这种确实不好判断,一般我都是尽量避免使用 false 和 0 的条件
    HarrisonZ
        18
    HarrisonZ  
       2017-10-19 17:42:06 +08:00
    api 输出 json,cs,ss 通讯都是 grpc,来回类型转换搞得简直要吐
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2775 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:26 · PVG 08:26 · LAX 16:26 · JFK 19:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.