【问题标题】:Handling exception from unparsable input into JSON.parse()处理来自 JSON.parse() 的不可解析输入的异常
【发布时间】:2014-10-27 23:09:39
【问题描述】:

我在创建一种在 JS 中管理 cookie 的方法时遇到了这个问题。我的 cookie 可以包含 JSON 格式的字符串:

var cookieContents = '{"type":"cookie","isLie":true}';

...或者只是简单的字符串:

var cookieContents = 'The cookie is a lie';

要解析 cookie,我最好使用JSON.parse(cookieContents)。这样做的问题是JSON.parse() 无法解析纯字符串并引发致命错误。

我的问题是处理这种情况的最佳/最广泛接受的方法是什么?

我尝试过使用 try/catch 语句:

var cookie1 = '{"type":"cookie","isLie":true}';
var cookie2 = 'The cookie is a lie';

function parseCookieString(str){
    var output;

    try{
        output = JSON.parse(str);
    } catch(e){
        output = str;
    }

    console.log(output);
}

parseCookieString(cookie1); // outputs object
parseCookieString(cookie2); // outputs string

http://jsfiddle.net/fmpeyton/7w60cesp/

这很好用,但感觉很脏。也许是因为我通常不处理 JS 致命错误。 在这种情况下更优雅地处理致命错误是否很常见?

【问题讨论】:

  • 这实际上是JSON.parse() 中的设计错误(哦!JavaScript 中的设计错误!如此罕见!哦等等...)-> 这不是致命错误,它应该返回 @ 987654328@ 什么的。或者它应该有一个只检查有效性的方法(比如JSON.isValid(),这可能是最干净的解决方案。)

标签: javascript json parsing


【解决方案1】:

尝试捕获是有意义的,但如果 JSON.parse 因您的 output 变量以外的其他原因引发错误,则最终可能包含您不想要的内容。

不过,这是一个有趣的问题。我会做这样的事情——基本上检查字符串中是否存在{}

function parseCookieString(str){
    var output;

    if (!!str.match(/^{.+}$/)) {
      output = JSON.parse(str);
    } else {
      output = str;
    }

    console.log(output);
}

parseCookieString(cookie1); // outputs object
parseCookieString(cookie2); // outputs string

【讨论】:

  • 字符串包含在花括号内的事实并不能使其成为有效的 JSON。
  • 不确定问题是无效的 JSON。基本上他提供了 2 个选项:数据中的有效 JSON 或数据中的有效字符串。上面的解决方案解决了这个确切的问题......有意义吗?
  • 如果他有"{The cookie is a lie.}"怎么办?
  • 这是无效的 JSON,这正是 OP 不关心的。
  • 不妨让我们也担心他可能有:"The cookie is a lie.
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 2011-08-15
  • 1970-01-01
  • 2010-12-09
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
相关资源
最近更新 更多