【问题标题】:isJSON in javascript, without try/catch [duplicate]javascript中的isJSON,没有try/catch [重复]
【发布时间】:2012-11-01 19:01:00
【问题描述】:

可能重复:
How to check if a string is a valid JSON string in JavaScript without using Try/Catch

问题已在此处提出:How to check if a string is a valid JSON string in JavaScript without using Try/Catch。没有给出有效的答案,即使经过验证的人也没有回答问题。

因此,不使用 try/catch 的唯一方法似乎是通过正则表达式;其中一个答案中给出的正则表达式仅针对 eval 进行验证,因此像“2001-05-06”这样的简单字符串将通过正则表达式,即使它不是 JSON。

那么有没有人用好的正则表达式来验证格式良好的 JSON 字符串?

【问题讨论】:

  • 使用正则表达式而不是 try/catch 正在用无效的 hack 替换正确的解决方案。
  • 你为什么不想使用try .. catch?使用起来似乎很合法,因为它在失败时会抛出异常。
  • 假设有一些 JS 库在内部不使用 try/catch 的情况下煞费苦心地实现了一个完全正确的 JSON 解析器——我很想知道你如何证明添加大量代码并接受性能损失这样您就不会编写使用 try/catch 的 3 行解决方案。这还没有考虑到更多的代码 == 更多的错误。
  • 如果已经问过了,你应该按照现行规则宣传这个问题,而不是重复。
  • 这是一个偏好问题。我更喜欢这样的代码:if(condition){do things}else{解释为什么你不能对用户做事}而不是 try{to do things}catch(an exception){if it failed}。我不记得我上次使用 try/catch 是什么时候了?除了处理数据库的python代码之外,如果数据库出现问题,则必须捕获错误。对我来说,在这里使用条件而不是 try 子句似乎是完全合法的。另外,为什么实现一个 json 解析器会很笨拙?克罗克斯福德的代码不正是这样吗?

标签: javascript regex json


【解决方案1】:

来自link 试试这个

var jsonData = '{"1":"test"}';

if (/^[\],:{}\s]*$/.test(jsonData.replace(/\\["\\\/bfnrtu]/g, '@'). replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {    
    alert('ok');
}else{    
    alert('no');
}

【讨论】:

  • 我的第一个测试:'{"1":"test":"a"}'; ==> 显示为有效的 JSON....
  • 正如原发帖人和我自己所评论的那样,像“2012-12-07”这样的简单字符串可以通过该测试,但它不是有效的 json。
【解决方案2】:

使用正则表达式而不是 try/catch 正在用无效的 hack 替换正确的解决方案。

您提供的链接建议更改您可以修改的JSON parsing code 以不引发异常。我建议在json_parse.js 中替换以下代码

    error = function (m) {
    // Call error when something is wrong.
        throw {
            name:    'SyntaxError',
            message: m,
            at:      at,
            text:    text
        };
    },

通过您将提供的回调调用。

但坦率地说,我最合理的建议是使用 try/catch。这是您在这里拥有的最好的工具。请注意,我的 JSON.parse 修改“建议”应该管理所有循环/递归的中断,这正是异常所做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 2011-06-01
    • 2023-01-25
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    相关资源
    最近更新 更多