Jquery.Ajax为我的JSON响应添加了双引号和换行符

时间:2015-12-11 17:50:57

标签: jquery json ajax php-5.6

我最近将我的开发服务器从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还有什么东西会导致这种奇怪的行为?

由于

3 个答案:

答案 0 :(得分:0)

只是回显数据

echo json_encode($response, JSON_HEX_APOS);

答案 1 :(得分:0)

我建议您使用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);
        }
});

收到回复后检查并检查浏览器控制台。你所有的问题都解决了。

答案 2 :(得分:0)

我问了一位我工作的高级程序员,他建议我检查是否有任何隐藏字符添加到响应中。在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 char,用于通知浏览器文件已编码。我必须使用这个small PHP script并在服务器上执行它以消除错误。

显然,当您在notepad ++中打开文件并保存它时会发生类似这样的事情,它可能会破坏编码。