如何校验 JSON 数据? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
guyskk
V2EX    编程

如何校验 JSON 数据?

  •  
  •   guyskk 2016-07-06 22:14:54 +08:00 5236 次点击
    这是一个创建于 3458 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在的情况是前后端分离,后端只提供 API ,前端 AJAX 调用,使用 JSON 格式传送数据。 这里涉及到 2 个问题:
    (1)如何描述 API?如何告诉前端你的接口需要什么参数,返回什么?
    (2)如何校验 JSON 数据?前端可能漏了参数,或是传了错误的参数。用户可能输入错误,需要有错误提示。黑客也可能构造非法的参数进行攻击。

    考虑过用 JSON-Schema ,但是 JSON-Schema 太复杂了,写起来也很累,用来描述 API 并不合适,我想要一种易读易写的格式,写完可以直接拿来当文档看。

    另外关于防攻击的: https://github.com/pallets/flask/issues/1421
    如果提交大量嵌套非常深的数据,服务器资源不是很容易就会耗尽吗,例如: json.loads('[' * 800 + ']' * 800)

    求前人指路,分享经验。

    12 条回复    2016-07-07 09:48:27 +08:00
    loading
        1
    loading  
       2016-07-06 22:20:26 +08:00 via Android
    了解一下: Restful api
    guyskk
        2
    guyskk  
    OP
       2016-07-06 22:23:31 +08:00
    @loading 是 Restful api ,但也需要写文档描述请求参数和返回值吧
    loading
        3
    loading  
       2016-07-06 22:25:41 +08:00 via Android
    cuebyte
        4
    cuebyte  
       2016-07-06 22:44:19 +08:00   1
    JSON 校验好像只有 json schema 吧,文档的话可以看看 swagger 和 raml
    guyskk
        5
    guyskk  
    OP
       2016-07-06 22:48:48 +08:00
    @loading 麻烦先看明白题目,谢谢。

    这是你发的链接里关于文档的内容,泛泛而谈:
    ```
    文档

    文档和 API 本身一样重要。文档应该容易找到,并且公开(把它们藏到 pdf 里面或者存到需要登录的地方都不太好)。文档应该有展示请求和输出的例子:或者以点击链接的方式或者通过 curl 的方式(请见 openstack 的文档)。如果有更新(特别是公开的 API ),应该及时更新文档。文档中应该有关于何时弃用某个 API 的时间表以及详情。使用邮件列表或者博客记录是好方法。
    ```
    这种跟话题没关系的文章,麻烦不要随随便便就丢过来。
    guyskk
        6
    guyskk  
    OP
       2016-07-06 22:51:33 +08:00
    @cuebyte swagger 了解过,也挺复杂的。 RAML 我先了解一下再说。
    bdbai
        7
    bdbai  
       2016-07-06 23:49:23 +08:00 via Android   1
    (1) 什么都不要写,问问你的前端需要什么;
    (2) 用你自己的轮子嘛。
    loading
        8
    loading  
       2016-07-07 07:04:34 +08:00 via Android
    @guyskk 我没乱丢链接…
    你连你 api 需要提供什么都不知道,我不提供入门级资料还能提供啥?况且,你问题里都没提到 restful api 所以,我认为你还是不了解的。
    loading
        9
    loading  
       2016-07-07 07:06:43 +08:00 via Android
    既然你知道设计成 restful 风格很好,自己深挖这方面资料就行。
    guyskk
        10
    guyskk  
    OP
       2016-07-07 07:40:05 +08:00 via Android
    @bdbai 唉,自己的轮子不够好用,算法很复杂很难实现,所以想问问各位的经验,实际项目中是怎么做的?
    shyling
        11
    shyling  
       2016-07-07 08:25:05 +08:00 via Android   1
    第一个直接参考 V2EX 的 api 介绍
    第二个方便的方法是将 json 映射为 Model ,类型匹配上进行校验。该是 Number 的不能是 String 。
    lijinma
        12
    lijinma  
       2016-07-07 09:48:27 +08:00
    多年后,你还是会需要一个类似 swagger 的东西。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     935 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:57 PVG 04:57 LAX 12:57 JFK 15:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86