将 JSON 保存到文件,如果存在则更改输出

Posted

技术标签:

【中文标题】将 JSON 保存到文件,如果存在则更改输出【英文标题】:Saving JSON to file, changing output if exists 【发布时间】:2016-04-09 11:56:41 【问题描述】:

我正在使用 php 将数组数据保存到 .json 文件中。 .json 文件然后被一些 JS 在其他地方调用并放入一个变量中。

这是 PHP 的代码:

$fetch = mysqli_query($connection, "SELECT * FROM mrb_prprty WHERE `nationalid` = '". $nationalid ."' AND `author` = '" .$username. "'");
$return_arr = array();

while ($row = mysqli_fetch_array($fetch)) 
    $row_array['firstName'] = $row['fname'];
    $row_array['lastName'] = $row['lname'];
    $row_array['nationality'] = $row['nationality'];
    $row_array['phone'] = $row['mobile'];
    $row_array['email'] = $row['email'];
    $row_array['street'] = $row['street'];
    $row_array['towncity']  = $row['towncity'];
    $row_array['postcode']= $row['postcode'];
    $row_array['county'] = $row['county'];
    $row_array['country'] = $row['country'];
    $row_array['rentpw'] = $row['rentpw'];
    $row_array['nationalid'] = $row['nationalid'];
    $row_array['passport'] = $row['passport'];
    $row_array['isFavorite'] = $row['favourite'];

    array_push($return_arr,$row_array);


$json_mrb = json_encode($return_arr);

$myFile = "userdata/". $username .".json";

$method = (file_exists($myFile)) ? 'a' : 'w';
$fh = fopen($myFile,$method);
fwrite($fh, $json_mrb."\n");

第一次执行时,它将检测文件是否存在并根据结果创建新文件或附加到现有文件。

这是第一次运行上面的PHP代码后'.json'文件的预览:

["firstName":"Ryan","lastName":"Butterworth","nationality":"rKqF01JNdAB1\/EjPW1sulcHzA+Lqp3y\/aaNtpixFphA=","phone":"6jAbOoIal2Eh73neklZgXcA2jJ3831uRiJWE74fADD8=","email":"gpLkiFg4ju4jv4QK6nftnPCqmzdENbsDt4ayI4L1rrkXvg0VJkxmP9Ac57fs4Ar\/","street":"22 Newton Drive","towncity":"Blackpool","postcode":"FY38BS","county":"England","country":"England","rentpw":"VCXaMj\/V6YNExbREuI08eOuINutZRxcx4vv5s2C2FR4=","nationalid":"dNDgHnJJg4rFgbb6qOEC\/dVlnJUNWLCZASo9X8GP5EE=","passport":"123456","isFavorite":""]

我遇到的问题是,当你第二次运行 PHP 代码时,.json 文件将如下所示:

["firstName":"Ryan","lastName":"Butterworth","nationality":"rKqF01JNdAB1\/EjPW1sulcHzA+Lqp3y\/aaNtpixFphA=","phone":"6jAbOoIal2Eh73neklZgXcA2jJ3831uRiJWE74fADD8=","email":"gpLkiFg4ju4jv4QK6nftnPCqmzdENbsDt4ayI4L1rrkXvg0VJkxmP9Ac57fs4Ar\/","street":"22 Newton Drive","towncity":"Blackpool","postcode":"FY38BS","county":"England","country":"England","rentpw":"VCXaMj\/V6YNExbREuI08eOuINutZRxcx4vv5s2C2FR4=","nationalid":"dNDgHnJJg4rFgbb6qOEC\/dVlnJUNWLCZASo9X8GP5EE=","passport":"123456","isFavorite":""]
["firstName":"Ryan","lastName":"Butterworth","nationality":"rKqF01JNdAB1\/EjPW1sulcHzA+Lqp3y\/aaNtpixFphA=","phone":"6jAbOoIal2Eh73neklZgXcA2jJ3831uRiJWE74fADD8=","email":"gpLkiFg4ju4jv4QK6nftnPCqmzdENbsDt4ayI4L1rrkXvg0VJkxmP9Ac57fs4Ar\/","street":"22 Newton Drive","towncity":"Blackpool","postcode":"FY38BS","county":"England","country":"England","rentpw":"VCXaMj\/V6YNExbREuI08eOuINutZRxcx4vv5s2C2FR4=","nationalid":"dNDgHnJJg4rFgbb6qOEC\/dVlnJUNWLCZASo9X8GP5EE=","passport":"123456","isFavorite":""]

javascript 将“.json”文件作为变量加载,例如:var contacts = //fileoutputhere,但正如您所见,.json 文件现在有两个数组列表,因此会出错。

而不是像这样保存到文件中: [ ...info... ] [ ...info... ]

我希望它像这样保存: [ ...info... , ...info... ]

我知道我必须以某种方式调整 PHP,但不知道如何做到这一点。有什么建议吗?

【问题讨论】:

您不能将 JSON 附加到现有文件中。您需要加载文件内容,在变量中解码,添加新数据,编码并保存覆盖旧文件。 抱歉,我是使用 JSON 格式的新手,您能否提供一个基本示例来说明我如何实现这一点?注意:这里的一切都按预期工作(当然除了 JS 变量,因为它在文件中被分成两个数组)我只是希望有一种方法可以删除方括号并在检测到文件时添加逗号存在,所以都在一个数组中 您需要先将文件读取到变量中,然后将新数据附加到该变量中的数组中,然后解码并保存文件(覆盖以前的文件,而不是附加)跨度> 【参考方案1】:

使用您的方法,目标文件中有多个 JSON 字符串,而不是唯一的 JSON。

以这种方式开始你的代码:

$myFile = "userdata/". $username .".json";

if( file_exists( $myFile ) )

    $data = file_get_contents( $myFile );
    $return_arr = json_decode( $data, TRUE );

else

    $return_arr = array();

此时,如果文件存在,则在$return_arr 中您之前保存了值。我使用json_encode 的第二个参数返回一个关联数组,以便与新添加的值保持一致,但在您的情况下,它是完全可选的。如果文件不存在,$return_arr 是一个空数组。

然后继续你的代码:

$fetch = mysqli_query($connection, "SELECT * FROM mrb_prprty WHERE `nationalid` = '". $nationalid ."' AND `author` = '" .$username. "'");

while ($row = mysqli_fetch_array($fetch)) 
    (...)

$json_mrb = json_encode($return_arr);

并覆盖现有文件(或创建一个新文件):

$fh = fopen( $myFile, 'w' );
fwrite( $fh, $json_mrb."\n" );

【讨论】:

这非常有效,也感谢您的解释 - 现在更好地理解这一点!【参考方案2】:

您需要将数据附加到 json 数组中,因此您必须先读取文件。这里有一些伪代码可以帮助您入门:

var myFile = "some-file.json";
var return_arr = array();
if(fileExists($myFile))
    //maybe add some error handling, in case the file contents are not json?
    $return_arr = json_decode(get_file_contents($myFile));


while($row = getRows())
    $row_array[x] = ...
    array_push($return_arr, $row_array);


$fh = $fopen($myFile, 'wa+');
fwrite(json_encode($return_arr));

【讨论】:

以上是关于将 JSON 保存到文件,如果存在则更改输出的主要内容,如果未能解决你的问题,请参考以下文章

运维管道和重定向语法

ubuntu常用命令解释

linux 基本命令2

Linux高级-基本命令-笔记

如何将我的 Python 爬虫输出保存到 JSON 文件?

重定向,管道符,黑洞文件