我试图用ajax读取文件,但我得到一个错误
SyntaxError: JSON。解析:意外的非空白字符 JSON数据的第1行第48列后的JSON数据
因为经过检查,我总是以""
作为最后的记录…?!
test.txt
文件:
one
two
three
这是我的ajax调用:
$.ajax( {
url: 'control.php',
type: "post",
dataType: "json",
data: details,
success: function(data, textStatus) {
$("#whitelist").append(data[0])
},
complete: function(jqXHR, responseText) {
// alert('complete')
},
error: function(jqXHR, textStatus, errorThrown) {
alert('error');
// var responseText = jQuery.parseJSON(jqXHR.responseText);
console.log(errorThrown);
}
});
这里是control.php
,读取文件,应该发送json编码的数组返回:
$path = "test.txt";
$file = fopen($path, 'r');
$data = fread($file, filesize($path));
fclose($file);
$lines = explode(PHP_EOL,$data);
error_log('Lines: ' . json_encode($lines, JSON_FORCE_OBJECT) . "err: " . json_last_error());
error_log('Lines: ' . serialize($lines));
echo json_encode($lines, JSON_FORCE_OBJECT);
以下是error_log()
的输出:
Lines: {"0":"one","1":"two","2":"three","3":""} json_last_error: 0
下面是firebug的输出:
{"0":"one","1":"two","2":"three","3":""}{"error":"Error","message":[]}
已经好几个小时了!这个""
到底是从哪里来的?此外,为什么json_last_error()
根本没有帮助?为什么构建一个简单的json数组如此困难?
我显然做错了什么。请给我指路,我累坏了。
由于无论如何都要将文件的整个内容读入内存,因此有一种更简单的方法可以按换行/换行分隔和忽略空行
$data = file($path, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
echo json_encode($lines, JSON_FORCE_OBJECT);
见http://docs.php.net/function.file
请在error.log之后的control.php中尝试下面的代码
$lines = array_slice($lines, 0, count($lines)-1);
echo json_encode($lines, JSON_FORCE_OBJECT);
希望它能帮助你解决问题
在control.php文件中替换
$lines = explode(PHP_EOL,$data);
$lines = explode(PHP_EOL,trim($data));
我已经测试过了,它的输出为
{"0":"one","1":"two","2":"three"}
使用trim()将删除所有不需要的空白
如果文件为空,那么read()将产生一个警告
fread(): Length parameter must be greater than 0
要防止出现这种情况,最终代码应该像这样
<?php
$path = "test.txt";
$lines = '';
if(filesize($path)>0){
$file = fopen($path, 'r');
$data = fread($file, filesize($path));
$lines = explode(PHP_EOL,trim($data));
fclose($file);
}
echo json_encode($lines, JSON_FORCE_OBJECT);
?>
只有当file不为空时,才需要打开&读取文件