我对jQuery相当陌生,我的JSON数据似乎没有按照我期望的方式解析。
所以我在PHP中通过json_encode($var)创建了我的数据,这似乎工作正常:
{"id":"7","0":"7","ip":"86.152.117.159","1":"86.152.117.159","proxyip":"86.152.117.159","2":"86.152.117.159","ping":"1","3":"1","time":"03:39:17","4":"03:39:17"}{"id":"6","0":"6","ip":"86.152.117.159","1":"86.152.117.159","proxyip":"86.152.117.159","2":"86.152.117.159","ping":"1","3":"1","time":"03:36:20","4":"03:36:20"}
(这是通过jQuery的AJAX从同一服务器/域上的单独URL导入的)。
但是当我使用此代码尝试导入它时:
$.ajax({url:"load.php",success:function(result){
var obj = jQuery.parseJSON(result);
$(".response").html(obj.id);
}});
并检查我的控制台,我得到"未捕获的语法错误:意外的令牌{",它指向索引中的"第 1 行.php - 请注意,我没有使用外部JS文件。
我不知道我做错了什么以及我应该如何解决这个问题,以便我可以在页面上以非 json 形式显示数据(即在表格中)
任何帮助将不胜感激!
编辑:
这是我的加载.php文件:
try {
$db = new PDO("mysql:host=$mysql_host;dbname=$mysql_db", $mysql_user, $mysql_pass);
} catch(PDOException $e) {
$e->getMessage();
}
$update = "SELECT * FROM traffic";
foreach ($db->query($update) as $user) {
echo json_encode($user);
}
echo json_encode(...)
两次打电话。将所有结果放入一个数组中,并对其进行编码。
$result = array();
foreach ($db->query($update) as $user) {
$result[] = $user;
}
echo json_encode($result);
然后在Javascript中,你需要一个循环来读出它们:
$.ajax({url:"load.php",success:function(result){
var obj = jQuery.parseJSON(result);
var ids = obj.map(function(el) {
return el.id;
});
$(".response").html(ids.join(' '));
}
});
你的 json 无效,使用 jsonlint 来检查一下。
Parse error on line 12:
... "4": "03:39:17"}{ "id": "6",
----------------------^
Expecting 'EOF', '}', ',', ']'
您有两个对象。像 [{}, {}]
这样的数组中应该只有一个或两个。
您应该能够一次回显所有内容,例如:
echo json_encode($db->query("SELECT * FROM traffic")->fetchAll());
改为尝试JSON.parse()
:
var obj = JSON.parse(result);
或者更好的是,在PHP中指定dataType:'json'
并设置json内容类型,您不必在JS中解析任何字符串:
$.ajax({url:"load.php", dataType:'json', success:function(result){
$(".response").html(result.id);
}});
谨慎:
确保您的 json 有效。如果您在 PHP 中使用循环,最好构造一个关联数组,然后将数组传递给json_encode()
一次。
在chrome开发者工具控制台中,我尝试了JSON.parse(''),并得到了同样的错误。
JSON.parse('{"id":"7","0":"7","ip":"86.152.117.159","1":"86.152.117.159","proxyip":"86.152.117.159","2":"86.152.117.159","ping":"1","3":"1","time":"03:39:17","4":"03:39:17"}{"id":"6","0":"6","ip":"86.152.117.159","1":"86.152.117.159","proxyip":"86.152.117.159","2":"86.152.117.159","ping":"1","3":"1","time":"03:36:20","4":"03:36:20"}')
VM123:2 Uncaught SyntaxError: Unexpected token {
问题是您要发送两个连续的对象 - {"id":"7",...}
和 {"id":"6",...}
。当它找到第一个右大括号}
时,它需要 EOF,因此第二个左大括号{
抛出意外标记语法错误。
解决方案是将对象包装在 JSON 数组中。
尝试在PHP中echo json_encode($db->query($update));
,不要循环。
在 chrome 开发者工具的"网络"选项卡中,当您检查预览时,您应该会看到
[{"id":"7",...},{"id":"6",...}]
(您的其余属性替换为我的省略号)。