Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP json_编码错误:最后一条记录为空_Php_Jquery_Json_Ajax - Fatal编程技术网

PHP json_编码错误:最后一条记录为空

PHP json_编码错误:最后一条记录为空,php,jquery,json,ajax,Php,Jquery,Json,Ajax,我试图用ajax读取一个文件,但是我得到了一个arror SyntaxError:JSON.parse:在JSON数据第1行第48列的JSON数据之后出现意外的非空白字符 因为在检查时,我总是以“作为最后一条记录结束 以下是test.txt文件: one two three 以下是我的ajax调用: $.ajax( { url: 'control.php', type: "post", dataType: "json",

我试图用ajax读取一个文件,但是我得到了一个arror

SyntaxError:JSON.parse:在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);
以下是
错误日志()
输出:

Lines: {"0":"one","1":"two","2":"three","3":""} json_last_error: 0
以下是firebug的输出:

{"0":"one","1":"two","2":"three","3":""}{"error":"Error","message":[]}
已经好几个小时了!!这个
到底是从哪里来的?还有,为什么
json\u last\u error()
毫无帮助?为什么构建一个简单的json数组如此困难


我显然做错了什么。请带我到灯光前,我已经筋疲力尽了。

请在control.php after error.log中尝试下面的代码好吗

$lines=array\u slice($lines,0,count($lines)-1);

echo json_encode($lines,json_FORCE_OBJECT)由于您正在将文件的全部内容读入内存,因此有一种更简单的方法可以按换行/换行将其拆分并忽略空行

$data = file($path,  FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
echo json_encode($lines, JSON_FORCE_OBJECT);

请参见control.php文件中的

,只需替换该行即可

$lines =  explode(PHP_EOL,$data);

我已经测试了它,它的输出如下

{"0":"one","1":"two","2":"three"}
使用trim()将删除任何不需要的空白

此外,如果文件为空,则fread()将生成警告

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);
?>


只有当文件不为空时,我们才需要打开并读取文件

您是否检查了testfile
test.txt
中的最后一行是否以回车/换行结束?如果是这样,这将在
$lines
数组中生成一个空项。@xaccrocher您可以添加test.txt文件吗contents@Bjoern是的,在vi中,光标位于“三”的
t
,下面的一行是空的
~
一行。有没有其他方法可以检查我的文件中是否有空行?当您从浏览器(直接,而不是通过ajax)调用脚本时,源代码视图中有什么?可能是一些php错误/警告消息?@VolkerK您的评论让我找到了解决方案:文件中的某个地方有一个恶意的
echo
,可能把json数组搞砸了。还有,你的答案对我很有用,谢谢大家!非常感谢您的帮助@sagar;我试过了,我试过了array_filter(),他们都做过删除这个空的最后一条记录的工作(我觉得很脏),但不管json_编码是什么,都会不断插入这个
{“error”:“error”,“message”:[]}
我对星星做了什么?!好的,它可以工作,只需删除第二行,因为$data在此阶段是一个格式良好的数组:)再次感谢,伙计们。
$data=file(…)
行将替换您发布的几乎所有其他内容,从
$file=fopen…
开始。
<?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);
?>