【问题标题】:Jquery.Ajax adds double quotes and new line to my JSON responseJquery.Ajax 在我的 JSON 响应中添加双引号和新行
【发布时间】:2016-03-17 17:21:42
【问题描述】:

我最近将我的开发服务器从 PHP 5.4 升级到 PHP 5.6,但在尝试对其进行测试时遇到了一个奇怪的错误。我所有的 PHP 代码都通过我的主视图以数组或字符串的形式返回数据,主视图使用以下代码将数据作为 JSON 发送回任何 Ajax 查询。 (出于测试目的,我停用了 MIME 类型)

public static function SendData($data)
{
    $response = array(
        'status'  => true,
        'message' => $data
    );
    //header('Content-type: application/json');
    exit(json_encode($response, JSON_HEX_APOS));
}

我的 Javascript 代码使用该数据,通常立即将其解析为 JSON,因为 MIME 类型告诉 JQuery 这样做并处理它。它在 PHP 5.4 中运行良好,但自从我升级后,我的响应被 Jquery 修改了。查看服务器在 FireBug 中的响应,我发现它是有效的 JSON(使用 JSONlint 测试)

{"status":true,"message":"Didier Tartempion|dtartempion@example.com|Gestion de commerce"}

但是当我在 firebug 中检查以下 Jquery 代码时

$.ajax({
        url:"Connect.php",
        type : 'POST',
        data : data,
        success:function(result)
        {
            //JSON processing, for now I debugg with
            alert (result);
        },
        error: function(qXHR, textStatus, errorThrown) 
        {
            alert(textStatus);
        }
});

成功的结果变量实际上包含我的格式奇怪的响应,使用firebug watch时看起来像这样:

"\n{"status":true,"message":"Didier Tartempion|dtartempion@example.com|Gestion de commerce"}"

因此,JQuery 无法解析这个并且 JSONlint 说它无效。是否有来自 PHP5.6 甚至可能导致这种奇怪行为的新服务器的东西?

谢谢

【问题讨论】:

  • 您需要在 ajax 中定义数据类型,否则返回的结果将是纯文本。 dataType = 'json'
  • 不应该是“header('Content-type: application/json');”做这份工作?无论哪种方式,我都尝试过,但我仍然得到一个解析错误,因为我的响应是 JSON Jquery 获取的无效。

标签: jquery json ajax php-5.6


【解决方案1】:

只是回显数据

echo json_encode($response, JSON_HEX_APOS);

【讨论】:

  • echo 实际上在 Jquery 接收的 JSON 字符串的末尾添加了另一个 \n。我变成了:"\n{"status":true,"message":"Didier Tartempion|dtartempion@example.com|Gestion de commerce"}\n"
  • 附加了标题?
  • 是的,我的 JS 代码使用 Header 进入错误函数并警告“parseError”,当对抛出的错误使用监视时,我看到相同的字符串
【解决方案2】:

我建议你使用return 而不是exit

public static function SendData($data)
{
    $response = array(
        'status'  => true,
        'message' => $data
    );
    //header('Content-type: application/json');
    return json_encode($response, JSON_HEX_APOS);
}

在您的 ajax 调用中添加 dataType 并添加 console.log()

$.ajax({
        url:"Connect.php",
        type : 'POST',
        data : data,
        dataType : 'json'
        success:function(result)
        {
            //JSON processing, for now I debugg with
            console.log(result);
        },
        error: function(qXHR, textStatus, errorThrown) 
        {
            console.log(textStatus);
        }
});

在收到响应后检查并检查您的浏览器控制台。你所有的问题都解决了。

【讨论】:

  • Return 不会向 Ajax 调用、exit 或 echo 发送回任何内容,但会添加双引号和 \n
【解决方案3】:

我询问了我在哪里工作的一位高级程序员,他建议我检查十六进制是否在响应中添加了任何隐藏字符。在PHP中转换为十六进制时,没有找到隐藏字符,但是在JS中尝试警告时出现了一个。

我将此代码添加到我的成功函数中

function toHex(str) {
                    var hex = '';
                    for(var i=0;i<str.length;i++) {
                            hex += ''+str.charCodeAt(i).toString(16);
                    }
                    return hex;
            }

            alert(toHex(result));

我注意到新服务器中添加了十六进制字符“feff”。通过互联网查看,我发现这是 BOM 字符,以通知浏览器该文件已编码。我不得不使用这个small PHP script 并在服务器上执行它以消除错误。

当你在记事本++中打开文件并保存它时,显然会发生这种情况,它可能会弄乱编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2012-12-30
    • 1970-01-01
    • 2014-10-04
    • 2011-05-08
    • 2019-09-21
    相关资源
    最近更新 更多