我试图将字符串解析为JSON,我收到了意外的令牌错误。
我使用http://json.parser.online.fr/检查有效性,但没有解析错误,但仍然说eval由于意外令牌而失败。如果您将JSON从下面粘贴到该网站,您可以看到它发现错误,但没有指定导致它的令牌。
下面是我要解析的内容。
{
"Polish": {
"Rent": [
{
"english": "a",
"audioUrl": "b",
"alternate": "c"
},
{
"english": "d",
"audioUrl": "e",
"alternate": "f"
}
]
}
}
我错过了一些明显的东西吗?
编辑
在:和“租”键之后,有一个不可打印的字符。
我在解析尝试之前对字符串进行了一些replace()调用,这可能会造成问题。
在解析特定行
之前"Rent":"[
我想删除:和[sybmols。
之间的双引号所以我正在使用:
var reg = new RegExp('":"', 'g');
var newStr = originalStr.replace(reg, '":');
我不知道上面为什么会导致不可打印的角色。
的 EDIT2
我做了一个快速检查,将上面的replace()调用粘贴到验证器中,手动删除了我使用replace()的双引号,并且不可读的字符仍然存在。因此错误出现在原始字符串中。更多代码:|
该字符串从ajax调用返回到驻留在服务器上的php脚本。 PHP脚本正在读取服务器上的一个目录并填充嵌套的关联数组以生成发送回JS端的字符串,该端编辑并解析它(如上所示)。
在目录中是JSON文件,我将这些内容插入到这个嵌套数组结构中以完成JSON层次结构。
不可读的字符是
ef bb bf
我用Google搜索并发现是代表文件内容的字符串的Byte Order Mark。
所以继承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字符表示这是一件坏事。
答案 0 :(得分:5)
你可能有一个不可打印的角色没有出现在你在问题中粘贴的内容中。我将您的文本复制并粘贴到您提供的链接的在线解析器中,并且干净地解析。
尝试将原始文本复制并粘贴到this online hex dump website,然后将您从上面的SO问题中复制和粘贴时的内容进行比较...如果它们不同,那么您将获得关于伪造的角色是。
这是我得到的输出的屏幕截图,它可以干净地解析。
答案 1 :(得分:0)
兄弟,我遇到了类似的问题,检查你的文件编码(UTF-8)和(UTF-8没有BOM)可以有所作为。