今天我一直在开发一个Web应用程序,我的javascript将一个get请求发送到处理数据库通信的php文件,并使用json编码的数组进行回复。
但出于某种原因,当我尝试在get请求的响应对象上使用JSON.parse时,我得到了
SyntaxError:JSON.parse:JSON数据第1行第1列的意外字符
从我通过谷歌搜索找到的,这意味着json格式有问题。但我似乎无法确定出现了什么问题。
.js代码
var oReq = new XMLHttpRequest(); //New request object
oReq.onload = function() {
alert(this.responseText);
var str = this.responseText;
var total = JSON.parse(str);
alert(total);
alert(total[0]);
};
var id = get('id'); //calls to a different function to retrive the get data
var ar = get('ar');
oReq.open("get", "getdata.php?id=" + id +"&ar=" + ar, true);
oReq.send();
访问getdata.php
<?php
header('Content-Type: application/json');
require 'connect.php';
if(isset($_GET["id"])){
$id = $_GET["id"];
$ar = $_GET["ar"];
if($stmt = $conn->prepare("SELECT id, nummer, navn, alder, rase, eier, adresse, postnummer, sted, email, tlf FROM hoppe WHERE id = ?")) {
$stmt->bind_param("s", $id);
$stmt->execute();
$stmt->bind_result($unikid, $nummer, $navn, $alder, $rase, $eier, $adresse, $postnummer, $sted, $email, $tlf);
while ($stmt->fetch()) {
$unikid = (string)$unikid;
$data = array($navn,$nummer,$alder,$adresse,$postnummer,$sted,$email,$tlf,$eier,$unikid);
}
$stmt->close();
}
}
echo json_encode($data,JSON_UNESCAPED_UNICODE);
//echo json_encode($data);
?>
使用不带JSON_UNESCAPED_UNICODE的json_encode对语法错误没有任何影响。如果我不使用它,像æøå这样的特殊字符将显示为“\ u00e5”或“\ u00f8”。
如果我通过网络浏览器访问它,getdata.php的直接输出是:
["Leif","456","1970-01-01","Bakken1","4867","Oslo","lf@kgo.com",864654,"Kåre","12"]
如果我复制此输出并将其直接放入我的javascript中,那么我的JSON.parse将按预期工作。
数据库连接有一个固定的字符集“UTF-8”,数据库使用“utf8_general_ci”,所以我很确定一切都应该是正确的格式。但是,如果我使用像{{3}}这样的网站,它会给我一个输出,否则
Error:Invalid encoding, expecting UTF-8, UTF-16 or UTF-32.[Code 29,Structure 0]
Error:Expecting object or array, not string.[Code 1, Structure 1]
Error:Strings should be wrapped in double quotes.[Code 17, Structure 1]
但是,如果我再次复制粘贴直接输出我在我的网络浏览器中查看它确认它是有效的。
那么,我错过了什么?
编辑1: 发现错误是由我的php文件没有编码为没有BOM的UTF-8引起的。希望这有助于遇到同样问题的人。