PHP json_encode错误:最后一条记录为空



我试图用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不为空时,才需要打开&读取文件

最新更新