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 · 6839 次点击
    这是一个创建于 1697 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   我们的愿景   ·   实用小工具   ·   5465 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:04 · PVG 14:04 · LAX 23:04 · JFK 02:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.