我试图将字符串解析为 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 字符表明这是一件坏事。