JS 如何验证 JSON 字符串 合法 可执行 JSON.parse 不抛出异常? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
TomatoYuyuko
V2EX    Javascript

JS 如何验证 JSON 字符串 合法 可执行 JSON.parse 不抛出异常?

  •  
  •   TomatoYuyuko 2019-08-05 19:28:04 +08:00 7512 次点击
    这是一个创建于 2335 天前的主题,其中的信息可能已经有所发展或是发生改变。
    data = (typeof event.data === 'string') ? JSON.parse(event.data) :event.data; 

    如果 event.data 是个乱七八糟的东西会报。。

    14 条回复    2019-08-06 09:32:30 +08:00
    geelaw
        1
    geelaw  
       2019-08-05 19:31:46 +08:00
    try catch 不就可以把异常吃掉了吗?
    TomatoYuyuko
        2
    TomatoYuyuko  
    OP
       2019-08-05 19:32:56 +08:00
    可以 catch 到,但是后面还是会进业务流程一样会报,有没有办法防患于未然(例如把后端祭天)
    hhacker
        3
    hhacker  
       2019-08-05 19:34:52 +08:00   1
    ```js
    function isJsonString(str) {
    try {
    JSON.parse(str);
    } catch (e) {
    return false;
    }
    return true;
    }
    ```
    TomatoYuyuko
        4
    TomatoYuyuko  
    OP
       2019-08-05 19:35:28 +08:00
    @geelaw #1 能吃掉往后跑,但是后面进业务流程对象没法用一样会报错,目标是在发现异常时给他个缺省值防止后面出事,类似 undefined || “”这种。。。
    ochatokori
        5
    ochatokori  
       2019-08-05 19:36:43 +08:00 via Android
    @TomatoYuyuko #2 你都 catch 到了为啥还让这个有问题的数据业务流程…,直接把这个有问题的丢了不行吗
    geelaw
        6
    geelaw  
       2019-08-05 19:37:24 +08:00   1
    @TomatoYuyuko #2 如果你看到了异常,自然就知道后面的业务不应该继续了。

    如果你还想继续,那差不多是厨房瓦斯爆炸之后你开始用瓦斯当米饭来炒菜的感觉。

    不存在防患于未然的方法,因为用户可能会不小心踢了网线。
    azh7138m
        7
    azh7138m  
       2019-08-05 19:38:32 +08:00   1
    把后端祭天(确信
    mystorp
        8
    mystorp  
       2019-08-05 19:43:23 +08:00 via Android   1
    你的提问包含两个逻辑:合法,JSON.parse 可以解析。正确的顺序应当是:JSON.parse 可解析,合法。第一个逻辑直接 try catch,第二个逻辑需要校验解析后的 json 对象,校验如果觉得麻烦可以使用 json schema,这是很多牛逼的库都在使用的,如: webpack。
    securityCoding
        9
    securityCoding  
       2019-08-05 19:44:50 +08:00
    老哥,都检测出错误了,还往下走不是找不自在吗?
    jaskle
        10
    jaskle  
       2019-08-05 19:49:44 +08:00 via Android
    吞掉错误你会更后悔
    Sparetire
        11
    Sparetire  
       2019-08-05 19:53:52 +08:00 via Android
    @TomatoYuyuko 这只能说明数据的源头就有问题,这种异常是不可恢复的,就不要想着 catch 以后能够恢复正常流程,catch 只是为了让你给用户一些友好提示或者回收一些资源
    bumz
        12
    bumz  
       2019-08-05 20:58:52 +08:00 via iPhone
    你的问题在于
    不知道如何正确处理异常
    bumz
        13
    bumz  
       2019-08-05 20:59:30 +08:00 via iPhone
    而你却想消除异常

    干掉提问题的人,问题就没有咯
    cweijan
        14
    cweijan  
       2019-08-06 09:32:30 +08:00
    使用正则表达式检测内容是否包在{}里面, 不能完全百分百'验证, 还得再加一层 try catch
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1190 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:40 PVG 01:40 LAX 09:40 JFK 12:40
    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