JSON.parse中位置0的JSON中出现意外的标记

时间:2018-01-10 19:51:24

标签: javascript php jquery json

[解决方案] 在ANSI中保存相关的.php文件解决了这个问题。查看已接受的答案以获取更多信息。

在尝试解析来自PHP json_encode()的JSON时,我在控制台中收到此错误:

VM2538:1 Uncaught SyntaxError: Unexpected token   in JSON at position 0
at JSON.parse (<anonymous>)
at Object.success (products.js:169)
at i (jquery-v3.2.1.min.js:2)
at Object.fireWith [as resolveWith] (jquery-v3.2.1.min.js:2)
at A (jquery-v3.2.1.min.js:4)
at XMLHttpRequest.<anonymous> (jquery-v3.2.1.min.js:4)

我尝试将MySql的服务器和表格排序设置为utf8_unicode_ci,如某些答案所示,但没有区别。 还将<meta http-equiv="Content-Type" content="text/html; charset=utf-8">添加到HTML头,将header('Content-Type: application/json; charset=utf-8');添加到PHP文件,这会稍微改变json_encode()的输出。 (两个例子都包含在底部)

[已更新] 以下是JavaScript: (atm我只是想将一个值记录到控制台,所以成功功能还没有完成)

function loadProducts() {
$.ajax({
  method: 'GET',
  dataType: 'json',
  url: 'ajax/list_products.php',
  success: function(products) {
    var json = products;
    console.log(json);
    console.log(json[0].Code);
    console.log(json[0]["Code"]);
  }
});

}

这是来自list_products.php的PHP代码:

<?php
$root = $_SERVER['DOCUMENT_ROOT'];
require_once $root . "/commander/class/product.php";

$product = new Product();
$productList = $product->listProducts();

if (!empty($productList) > 0) {
  echo json_encode($productList);
}else {
  echo "Error - Records are empty.";
}

这是list_products.php没有header('Content-Type: application/json; charset=utf-8');的输出:PasteBin

header('Content-Type: application/json; charset=utf-8');PasteBin

1 个答案:

答案 0 :(得分:0)

标题丢失或无效可能导致响应以意外格式出现,并在开头留下一个不可见的'\ ufeff'标记。这用于表示所接收消息的字节顺序,并使其对任何接收者都可读(但在应用程序内很难使用)。

如果您是发件人,则需要调整标头以获得正确的字符集和内容类型。

如果您是接收者,您可以通过删除第一个字符并在正文中调用JSON.parse(或您的语言等效)来将响应转换为有效的JSON。

有关详细信息,请参阅此问题,答案和wiki:

'Unexpected token' when using JSON.parse from array made in PHP

https://en.wikipedia.org/wiki/Byte_order_mark#UTF-16