2017-07-25 232 views
-1

我在某些字符上使用JSON.parse時遇到了一些麻煩。我通過API接收這些數據,但我沒有辦法在服務器端強制任何形式的編碼,這些數據是按原樣提供給我的。JSON.parse字符串中包含特殊字符的意外字符?

這是有問題的JSON:

{"name": "»»»»»»»"} 

我創建與JSON數據和返回「在位置11 JSON意外標記」的基本功能JSON.parse一個的jsfiddle。 (裏面還有一些特殊的字符,你可能不會在瀏覽器中看到的,會的jsfiddle告訴他們)

https://jsfiddle.net/4u1LtvLm/2/

我怎麼會去這個字符串就可以做JSON.parse之前殺青,而不會丟失特殊字符?

編輯:修改jsfiddle和json只包含引起麻煩的字符串,所以它不會讓每個人感到困惑。

+0

什麼字符在423? –

+1

JSON對我來說工作得很好。 –

+0

看起來像是「»»»»»»»」 – jakerella

回答

0

的問題在423位置是這樣的性格:

» 

這不是一個標準的ASCII字符。 JSON對其內容有一些限制(UTF-8),您應該可以在有效的JSON字符串中使用此字符。但是,看起來你必須正確地逃避它。

我會通過替換那些非ASCII字符(UTF-8代理)到他們的轉義版本(如\x0382等)來轉換字符串。只有通過JSON解析器轉載它並最終期望數據包含這些轉義字符。

根據你如何使用它們,它們可能已經格式良好或需要被轉換回UTF-8替代品。

編輯:有效的JSON文本實際上應該是UTF-8,但這是標準。相反,解析器的糟糕的非標準實現可能不符合此限制並需要ASCII。這顯然意味着在使用它之前會有眼淚。

編輯2:哦,等等。這是在node.js上?那麼,這根本就不是一個糟糕的實現,實際上它是我見過的最好的(最快和最健壯的)之一......考慮只能作爲最後的手段轉換爲ASCII。如果可能的話,找出真正的罪魁禍首並解決問題而不用轉換。只要它是一個UTF-8字符串,它應該可以直接使用。如果它是一個UNICODE字符串,請將其轉換爲UTF-8(不是ASCII ...忘記ASCII ... node.js應該與UTF-8完美配合)。

順便說一句,通過在網頁上發佈字符串,你本質上解開了編碼並將其強制爲UTF-8,這可能是我們無法重現你的問題的原因。

編輯3:如果有疑問,請使用this encoder

+1

JSON應該是UTF-8 ... –

+0

我在這方面有點模糊,我修改了我的答案。 – pid

0

JSON.parse需要獲取一個只包含unicode字符的字符串(請參閱Json parsing with unicode characters)。

對於您而言,JSON.parse方法失敗,因爲您的字符串包含非Unicode字符。如果將字符串粘貼到http://jsonparseronline.com/中,您將看到它由於字符而失敗,這是字符串未正確編碼時顯示的字符。

所以,如果你沒有辦法改變你的字符串的內碼,你將無法做到這一點。你可以嘗試像this改變編碼,但TI給出一個明確的答案,你需要知道你的字符串是如何在第一時間

0

我的解決辦法是這樣的編碼:https://stackoverflow.com/a/40558081/370709

function escapeUnicode(str) { 
    return str.replace(/[^\0-~]/g, function(ch) { 
     return "\\u" + ("0000" + ch.charCodeAt().toString(16)).slice(-4); 
    }); 
} 

問題解決了!