2012-10-07 52 views
4

好吧,我一直在處理一個返回手工製作的JSON的PHP 5.3服務器(因爲在5.3中沒有JSON_UNESCAPE_UNICODEjson_encode函數中),在閱讀this thread並做了一些測試之後,我想我發現了一個問題jQuery的parseJSON函數。爲什麼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,因爲我認爲這是一個適當的錯誤。你怎麼看?

回答

12

這不是一個錯誤,它與如何在JavaScript中處理字符串文字有關。當你有:

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

...您的字符串將會被解析成:

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

... 之前,它被傳遞給parseJSON()。這顯然不是有效的JSON,因爲\n已被轉換爲「hi小男孩」中間的字面換行符?串。

您希望'\n'序列在轉換爲文字換行符之前使其成爲parseJSON()函數。爲了實現這一點,需要在文字字符串中兩次跳轉兩次。像:

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

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

+0

嗯我真的不知道它不是一個錯誤,但。儘管如何在JavaScript中處理字符串文字,jQuery應該檢查一個字符是否爲換行符並接受它,因爲可以這樣做:http://jsfiddle.net/UTVcW/ –

+0

@JoseTomasTocino - 他們可以這樣做,是的。但他們的JSON解析器不會遵循[JSON規範](http://www.json.org/),它明確排除了其定義中的字面「控制字符」(如「回車符」和「換行符」)一個有效的字符串。所以如果這是一個錯誤,那就是規範中的一個錯誤,而不是jQuery(或其他任何人)實現它的錯誤。 – aroth

+0

那麼,在JSON規範中,[字符串序列](http://www.json.org/string.gif)似乎接受「\ n」字符(這實際上是兩個字符,我明白了)。在jQuery解析器中添加一個異常是明智的,因此如果有單字符「\ n」,他們會將它與兩個字符「\ n」相關聯並接受傳入的字符串。我想不出任何其他行爲可能有害的情況。 –

相關問題