这是我的ajax上下文的简化PHP方面:
// in a for loop
$text = "/home/ubuntu/CANE-HDD-100/y.txt"
// $text_encoded = urlencode($text);
// $text_encoded = preg_replace("/(\-)/", "%2D", $text_encoded);
$text_encoded = "%2Fhome%2Fubuntu%2FCANE%2DHDD%2D100%2Fy.txt"
$structure[$i] = $text_encoded;
echo json_encode($structure);
这是JS方面:
request.onload = function()
{
var cleanedText = JSON.parse(this.responseText);
alert(cleanedText);
};
抛出以下错误:
SyntaxError:JSON.parse:JSON数据第1行第1列的意外字符
如果我将JSON.parse(this.responseText)
替换为decodeURI(this.responseText)
,我会cleanedText
等于
/home/ubuntu/CANE-HDD-100/y.txt ["%2Fhome%2Fubuntu%2FCANE-HDD-100%2Fy.txt"]
我不喜欢,因为for
上的一个hypotetic cleanedText
循环会将该变量的每个元素(正确)视为一个字符,而我显然希望将元素作为整个URL
一种可能的,肮脏的解决方法是在cleanedText
上设置一些正则表达式以恢复每个网址,但我想知道是否会有更清洁的方式。
答案 0 :(得分:0)
w3re的评论必须是正确的。您必须拥有格式错误的JSON。我们可以通过从decodeURI
获取输出,然后通过encodeURI
运行它来获取,从而获得必须是PHP的原始字符串,然后在其上尝试JSON.parse
。我们收到错误:
JSON.parse(encodeURI('/home/ubuntu/CANE-HDD-100/y.txt ["%2Fhome%2Fubuntu%2FCANE-HDD-100%2Fy.txt"]'))
(program):1 Uncaught SyntaxError: Unexpected token /
该错误来自Chrome,但是:1
说的是“第1行”而/
位于第1列,所以我认为这是您看到的错误。
基本上,这个字符串是无效的JSON,因为开头的所有内容都没有用引号括起来。
但是,例如,如果你把它全部放在引号中并逃避现有的引用,这将有效:
JSON.parse('"/home/ubuntu/CANE-HDD-100/y.txt \\"%2Fhome%2Fubuntu%2FCANE-HDD-100%2Fy.txt\\""')
或使用数组:
JSON.parse('["/home/ubuntu/CANE-HDD-100/y.txt", "%2Fhome%2Fubuntu%2FCANE-HDD-100%2Fy.txt"]')
或对象:
JSON.parse('{"/home/ubuntu/CANE-HDD-100/y.txt": "%2Fhome%2Fubuntu%2FCANE-HDD-100%2Fy.txt"}')
所以在你的JSON编码和解码中你的PHP或JavaScript中必须出错。为了进一步提供帮助,我需要查看更多代码。