你好,我试图编辑和保存一些数据在我现有的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脚本需要formId
和mailTo
参数,但您只发送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()为额外的数据