V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
TomatoYuyuko

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

  •  
  •   TomatoYuyuko · Aug 5, 2019 · 7713 views
    This topic created in 2469 days ago, the information mentioned may be changed or developed.
    data = (typeof event.data === 'string') ? JSON.parse(event.data) :event.data;
    
    

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

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

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

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

    干掉提问题的人,问题就没有咯
    cweijan
        14
    cweijan  
       Aug 6, 2019
    使用正则表达式检测内容是否包在{}里面, 不能完全百分百'验证, 还得再加一层 try catch
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3066 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 14:05 · PVG 22:05 · LAX 07:05 · JFK 10:05
    ♥ Do have faith in what you're doing.