【问题标题】:Strange issue with Json & PHPJson 和 PHP 的奇怪问题
【发布时间】:2015-12-20 16:25:08
【问题描述】:

有什么原因导致无法在服务器上评估 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(); 返回 "unexpected token"

如上所述,奇怪的是在我的本地它可以工作(输出与服务器相同但js不会触发任何错误)

我几乎整天都在为此苦苦挣扎……任何帮助都非常感谢,谢谢

更新:

console.log(transport.responseText) 
-> {"shipping_method":"","payment_method":""}

在 chrome 中检查服务器响应“网络选项卡”,与我的本地相比,我可以看到一个小的差异:如果我将鼠标移到响应内容之前,则在响应内容之前有一个小的 red dot(比如说\ufeff它,我不确定是什么意思……)

【问题讨论】:

  • 执行 JSON.parse(transport.responseText) 时会发生什么?你能显示console.log(transport.responseText)的输出吗
  • 您是否尝试过“元素检查器”上的“网络”选项卡,在您最喜欢的浏览器上可用?
  • 您可以尝试使用 jQuery.parseJSON 代替 evalJSON。它是我倾向于使用的,但不确定你的实际错误是什么
  • 如果输出相同且 Javascript 代码相同 - 那么它可以工作。你做了一些错误的假设。
  • en.m.wikipedia.org/wiki/Byte_order_mark 所以你的一台 php 服务器可能有 mbstring 扩展名,而另一台没有。

标签: javascript php json


【解决方案1】:

你可以使用map函数来评估json值

       $.map(transport, function (item){    
 totals.update(item.total);;
       });

我认为它工作正常

【讨论】:

【解决方案2】:

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

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

  • chrome 检查器显示a red dot -> Byte_order_mark \ufeff 字符(又名BOM

这可能意味着缺少 BOM 字符并且 这会破坏 json 解析。

解决方案:

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

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

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

【讨论】:

  • 遇到了同样的问题。感谢您分享您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2020-07-28
  • 2012-02-02
  • 2011-12-09
相关资源
最近更新 更多