【问题标题】:Why jQuery.parseJSON does not accept newlines?为什么 jQuery.parseJSON 不接受换行符?
【发布时间】:2012-09-27 17:57:06
【问题描述】:

好的,所以我一直在处理返回手工 JSON 的 PHP 5.3 服务器(因为在 5.3 中,json_encode 函数中没有 JSON_UNESCAPE_UNICODE)并且在阅读了 this thread 并进行了一些测试之后,我想我在 jQuery 的 parseJSON 函数中发现了一个问题。

假设我有以下 JSON:

{
    "hello": "hi\nlittle boy?"
}

如果您使用 jsonlint.com 检查它,您可以看到它是有效的 JSON。但是,如果您尝试以下操作,则会收到错误消息:

$(function(){
    try{
        $.parseJSON('{ "hello": "hi\nlittle boy?" }');
    } catch (exception) {
        alert(exception.message);
    }    
});​

Link to the fiddle.

我在 jQuery 上打开了bug report,因为我认为这是一个正确的错误。你怎么看?

【问题讨论】:

    标签: php javascript jquery json


    【解决方案1】:

    这不是错误,它与 JavaScript 中字符串文字的处理方式有关。当你有:

    '{ "hello": "hi\nlittle boy?" }'
    

    ...您的字符串将被解析为:

    { "hello": "hi
    little boy?" }
    

    ...之前它被传递给parseJSON()。这显然不是有效的 JSON,因为 \n 已转换为“嗨小男孩?”中间的文字换行符。细绳。

    您希望 '\n' 序列在转换为文字换行符之前使其进入 parseJSON() 函数。为此,需要在文字字符串中对其进行 两次 转义。喜欢:

    '{ "hello": "hi\\nlittle boy?" }'
    

    示例:http://jsfiddle.net/m8t89/2/

    【讨论】:

    • 嗯,我不太确定这不是一个错误。尽管在 JavaScript 中如何处理字符串文字,jQuery 应该检查一个字符是否是换行符并接受它,因为它是可能的:jsfiddle.net/UTVcW
    • @JoseTomasTocino - 他们可以做到,是的。但是他们的 JSON 解析器不会遵循 JSON spec,它从有效字符串的定义中明确排除了文字“控制字符”(例如“回车”和“换行符”)。因此,如果这是一个错误,那是规范中的错误,而不是 jQuery(或其他任何人)实现它的错误。
    • 嗯,在 JSON 规范中,string sequence 似乎接受“\n”字符(我明白这实际上是两个字符)。在 jQuery 的解析器中添加一个异常是明智的,因此如果有一个单字符“\n”,它们会将其关联到两个字符“\n”并接受传入的字符串。我想不出任何不这样做可能有害的情况。
    • 好的,看起来 Chrome 和 firefox javascript 引擎的行为方式相同,说 json 是错误的。这几乎是一场失败的战斗。
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2013-07-24
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多