2017-07-25 238 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); 
    }); 
} 

问题解决了!