4

我试图将字符串解析为 JSON,但出现意外的令牌错误。

我正在使用http://json.parser.online.fr/检查有效性,它没有出现解析错误,但仍然说 eval 由于意外令牌而失败。如果您将下面的 JSON 粘贴到该网站,您可以看到它发现了一个错误,但没有指定是什么令牌导致它。

这是我要解析的内容。

{
    "Polish": {
        "Rent": [
            {
                "english": "a",
                "audioUrl": "b",
                "alternate": "c"
            },
            {
                "english": "d",
                "audioUrl": "e",
                "alternate": "f"
            }
        ]
    }
}

我错过了一些明显的东西吗?


编辑
在“Rent”键之后的 : 和 [ 之间有一个不可打印的字符。

在解析尝试之前,我正在对字符串进行一些 replace() 调用,这可能会产生问题。

在解析该特定行之前

"Rent":"[

我想删除 : 和 [ sybmols 之间的双引号。

所以我正在使用:

var reg = new RegExp('":"', 'g');
var newStr = originalStr.replace(reg, '":');

我不知道为什么上面会导致无法打印的字符。


EDIT2
我快速检查了删除粘贴到验证器中的上述替换()调用,手动删除了我使用替换()的双引号,并且不可读的字符仍然存在。所以错误出现在原始字符串中。所以更多的代码:|

该字符串从 ajax 调用返回到驻留在服务器上的 php 脚本。PHP 脚本正在读取服务器上的目录并填充嵌套关联数组以生成字符串,该字符串被发送回 JS 端,JS 端对其进行编辑和解析(如上所示)。

目录中有 JSON 文件,我将其内容插入到这个嵌套数组结构中以完成 JSON 层次结构。

不可读的字符是

ef bb bf

我用谷歌搜索发现是代表文件内容的字符串的字节顺序标记

所以继承人的 PHP 代码读取目录和 JSON 文件创建嵌套数组结构为 JSON_encode()d 并发送回 JS

if ($langHandle = opendir($langDir)) {
while (false !== ($langEntry = readdir($langHandle))) {
    $currentLangDir = $langDir . "/" . $langEntry;
    if (is_dir($currentLangDir) && $langEntry != '.' && $langEntry != '..') {
        $currentLang = array();
        if ($currentLangHandle = opendir($currentLangDir)) {
            while (false !== ($catEntry = readdir($currentLangHandle))) {
                $currentCatFile = $currentLangDir . "/" . $catEntry;
                if(is_file($currentCatFile) && $catEntry != '.' && $catEntry != '..') {
                    $currentCat = file_get_contents($currentCatFile);
                    $currentLang[removeFileExtension($catEntry)] = $currentCat;
                }
            }
        }
        $langArray[$langEntry] = $currentLang;
    }
}

我能做些什么来修复这些不需要的字符,快速搜索删除 BOM 字符表明这是一件坏事。

4

2 回答 2

6

您可能有一个不可打印的字符,该字符未显示在您粘贴到问题中的内容中。我将您的文本复制并粘贴到您提供的链接上的在线解析器中,它解析得很干净。

尝试将您的原始文本复制并粘贴到这个在线十六进制转储网站中,并与您从上面的 SO 问题中复制和粘贴时得到的内容进行比较......如果它们不同,那么您将知道假字符在哪里.

这是我得到的输出的截图,它解析得很干净。

在此处输入图像描述

于 2013-09-20T15:46:23.280 回答
0

兄弟,我遇到了类似的问题,检查你的文件编码(UTF-8)和(UTF-8 WITHOUT BOM)会有所不同。

于 2013-12-13T22:41:31.350 回答