有什么原因导致 json 字符串在服务器上无法评估 (transport.responseText.evalJSON();
) 但在我的本地安装上有效?
我正在执行一个简单的 ajax 请求,如下所示:
new Ajax.Request(
this.saveUrl, {
method: 'post',
parameters: Form.serialize(this.form),
onLoading: function () {
totals.update('<div class="loading-ajax"> </div>');
},
onSuccess: function (transport) {
if (transport.status == 200) {
var data = transport.responseText.evalJSON();
totals.update(data.shipping_method);
}
},
onFailure: checkout.ajaxFailure.bind(checkout)
}
);
在服务器端,我输出一个包含一些 html 的数组:
$data = array(
'shipping_method' => $shipping_method,
'payment_method' => $payment_method
);
echo json_encode($data);
我尝试将 $total
和 '$other' 评估为空字符串 ''
但得到了相同的结果:
transport.responseText.evalJSON();
返回一个“意外 token ”
如上所述,奇怪的是,在我的本地它可以工作(输出与服务器相同,但 js 不会触发任何错误)
我几乎一整天都在努力解决这个问题......非常感谢任何帮助,谢谢
更新:
console.log(transport.responseText)
-> {"shipping_method":"","payment_method":""}
在 chrome 中检查服务器响应“网络选项卡”,与本地相比,我可以看到一个小小的差异:响应内容之前有一个小红点
if ( 就是说 \ufeff
如果我将鼠标移到它上面,我不确定其含义...)
最佳答案
经过一些测试,我发现问题出在某些 PHP 文件中使用的编码,我的同事想到了切换到 ANSI 的绝妙主意。 (ISO-8859)
由于某种原因,这些使用 ANSI 编码的文件生成的 JSON 内容有所不同:
- chrome 检查器显示
红点
->Byte_order_mark
\ufeff
字符(又名BOM
)
这可能意味着 BOM 字符丢失,并且这破坏了 json 解析。
解决方案:
在我解析并清除 BOM 字符中的所有项目文件后,chrome 不会在检查器中显示红点,并且问题消失了
仍然不清楚为什么在我的本地安装上没有出现问题,而在服务器上(都是linux)却出现了问题,但这里可能涉及多个设置......
关于javascript - Json 和 PHP 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738098/