JSON.parse带有字符串中特殊字符的意外字符?

时间:2017-07-25 18:55:17

标签: javascript json node.js

我在某些字符上使用JSON.parse时遇到了一些麻烦。我通过API收到这些数据,我无法在服务器端强制进行任何形式的编码,这些数据按原样提供给我。

这是有问题的json:

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

我使用json数据和基本的JSON.parse函数创建了一个jsfiddle,它返回“位置11的JSON中的意外令牌”。 (你可能在浏览器中看不到一些特殊字符,jsfiddle会显示它们)

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

在对JSON.parse执行此操作之前,如何修复此字符串,而不会丢失特殊字符?

编辑:修改了jsfiddle和json只包含导致麻烦的字符串,所以对每个人来说都不那么混乱。

3 个答案:

答案 0 :(得分:1)

我的解决方案是: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);
    });
}

问题解决了!

答案 1 :(得分: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

答案 2 :(得分:0)

JSON.parse需要获取仅包含unicode字符的字符串(请参阅Json parsing with unicode characters)。

对于您来说,JSON.parse方法失败,因为您的字符串包含非unicode字符。如果将字符串粘贴到http://jsonparseronline.com/,您将看到它因字符而失败,如果字符串未正确编码,则该字符是浏览器显示的字符。

因此,如果您没有办法更改字符串的结束编码,那么您将无法做到这一点。您可以尝试使用类似this的内容来更改编码,但是如果您首先需要了解字符串的编码方式,则需要明确答案