chrome中更新的JSON文件在firefox中不工作


JSON file updated in chrome not working in firefox

你好,我试图编辑和保存一些数据在我现有的JSON文件,这里是代码-

var newData = { mailTo: 'abc@123.com'};
$.ajax({
type: 'POST',
url: 'jsonHandler.php',
data: newData,
}).done(function( formData ) {
formData = eval('(' + formData + ')');
$('#mail').val( formData.load[0].mailTo );
});

这在chrome和IE中工作,但当我使用firefox运行它时,JSON没有得到更新。

这是在Firefox中生成的请求头(使用firebug获得)

Request Headers
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length  12
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost
Referer http://localhost/gandu/
User-Agent  Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0
X-Requested-With    XMLHttpRequest

jsonHandler.php代码

<?php
require_once('JSON.php');
    $json = new Services_JSON();
    $json_data = json_decode(file_get_contents('formData.json'), true);
    if (isset( $_POST['formId'])) {
        $json_data['load'][0]['formId'] = $_POST['formId'];
    } else {
        echo 'No text found';
    }
    if (isset( $_POST['mailTo'])) {
        $json_data['load'][0]['mailTo'] = $_POST['mailTo'];
    } else {
        echo 'No text found';
    }
    $output = ($json->encode($json_data));
    file_put_contents('formData.json', $output);
    print ($output);
    ?>

我做错了什么吗?

firebug错误-

    SyntaxError: missing ) in parenthetical
a()jquery.min.js (line 2)
    e = Object { url="jsonHandler.php", isLocal=false, global=true, more...}
    n = Object { readyState=4, 
    responseText="No text found{"load":[{..."qq","fmessage":"qq"}]}", status=200, more...}
        r = Object { text="No text found{"load":[{..."qq","fmessage":"qq"}]}"}
        a()jquery.min.js (line 2)
        e = 200
        n = "OK"
        s = Object { text="No text found{"load":[{..."qq","fmessage":"qq"}]}"}
        a = "Date: Sat, 01 Jun 2013 ...ntent-Type: text/html'r'n"
        a()jquery.min.js (line 2)
        e = readystatechange
        i = undefined
        [Break On This Error]   
        (No text found{"load":[{"formId":"form2","mailTo":"def@123.com"}]

显示提示错误的警告框。

您的PHP脚本需要formIdmailTo参数,但您只发送mailTo。当它没有看到formId时,它会响应No text found。这使得结果JSON无效。您可以在错误消息中看到:返回的字符串以:

开头
No text found{"load":[{"formId":"form2","mailTo":"def@123.com"}]

所以你要做的是:

eval('(No text found{"load":[{"formId":"form2","mailTo":"def@123.com"}]...)');

但是这个字符串不是有效的Javascript,所以eval得到一个错误。

你要么改变PHP,让它以不同的方式报告错误,要么改变Javascript,让它在解码之前从返回的字符串中删除这个。

你也不应该使用eval()来解析JSON。用途:

formData = $.parseJSON(formData);

删除"No text found"前缀后。

我也有点怀疑$json->encode($json_data)。为什么要用这个代替内置的json_encode($json_data)呢?

试试这个,它会给你一个更好的错误日志

var newData = { mailTo: 'abc@123.com'};
$.ajax({
type: 'POST',
url: 'jsonHandler.php',
data: newData,
success: function( formData ) {
 formData = eval('(' + formData + ')');
 $('#mail').val( formData.load[0].mailTo );
 },
 error:function(jqXHR,textStatus,errorThrown ){
   alert(textStatus + "               " +errorThrown );
 }
});

或在你的情况下覆盖。fail()为额外的数据