javascript - Json 和 PHP 的奇怪问题

标签 javascript php json

有什么原因导致 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">&nbsp;</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 如果我将鼠标移到它上面,我不确定其含义...)

enter image description here

最佳答案

经过一些测试,我发现问题出在某些 PHP 文件中使用的编码,我的同事想到了切换到 ANSI 的绝妙主意。 (ISO-8859)

由于某种原因,这些使用 ANSI 编码的文件生成的 JSON 内容有所不同:

  • chrome 检查器显示红点 -> Byte_order_mark \ufeff 字符(又名 BOM)

这可能意味着 BOM 字符丢失,并且这破坏了 json 解析。

解决方案:

在我解析并清除 BOM 字符中的所有项目文件后,chrome 不会在检查器中显示红点,并且问题消失了

仍然不清楚为什么在我的本地安装上没有出现问题,而在服务器上(都是linux)却出现了问题,但这里可能涉及多个设置......

要清理文件,请参阅:Elegant way to search for UTF-8 files with BOM?

关于javascript - Json 和 PHP 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738098/

相关文章:

PHP: Doctrine: order joined records

jquery - 将 json 数据发布到 Express 应用程序正在获取 { }

json - 谷歌关闭 XhrIo

java - Gson反序列化json,其中包含可以是字符串或对象的参数

javascript - 如何计算位置与距离不同

javascript - 寻找在 Node.js 中发布数千个 HTTP 请求的有效方法

php - 为什么 PHP date ('m' , strtotime ('-1 months' )) 今天不能正常工作? 07/31

javascript - 如何设置更改单选按钮的值?

javascript - 如何使用 javascript 在嵌套对象中的特定位置添加子节点

javascript - React-Flow:您可以将 Prop 传递给 React-Flow 中的自定义节点吗?