PHP API将JSON保存到文件中,然后读取文件

PHP API将JSON保存到文件中,然后读取文件,php,json,Php,Json,有麻烦了 基本上,我试图访问一个API来检索数据。我的连接数量有限,所以我的计划是检索数据,将其保存到主机上的文本文件中,然后根据需要从该文件中读取。然后我会使用cron作业每隔几个小时用新数据重新填充文件 无论如何,我已经登录到API并检索了数据,可以显示“实时”数据而不会出现问题 当试图保存数据并读取文本文件时,问题就开始了。这是一个多深度阵列 检索代码 $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); cu

有麻烦了

基本上,我试图访问一个API来检索数据。我的连接数量有限,所以我的计划是检索数据,将其保存到主机上的文本文件中,然后根据需要从该文件中读取。然后我会使用cron作业每隔几个小时用新数据重新填充文件

无论如何,我已经登录到API并检索了数据,可以显示“实时”数据而不会出现问题

当试图保存数据并读取文本文件时,问题就开始了。这是一个多深度阵列

检索代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, 'URL GOES HERE');
//prepare the field values being posted to the service
$data = array("appkey" => "KEY","account" => "ACCOUNT" );
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

//make the request
$result = curl_exec($ch);
curl_close($ch);
这样代码就很好了,我可以显示

$properties = json_decode($result, true);
$properties = $properties['properties'];
//pr($parsed_json);

foreach($properties as $key => $value) {

    if ($_GET[section] == "sale") {

        if ($value['category_id'] == "1") {

            displayProp ($address, $value['price'], $value['qualifier_name'], $value['summary']); 

        }

    } elseif ($_GET[section] == "rent") {

        if ($value['category_id'] == "2") {

            displayProp ($address, $value['price'], $value['freq_name'], $value['summary']); 

        }
    }
}
这是有效的

然后,我尝试使用

file_put_contents('properties.txt', json_decode($result));
将数据保存在文件中。但当我试图从中读取数据时,无论我尝试什么,都会出现随机错误。有人能帮忙读取文本文件并输出数组吗

使用JSONLint,我验证数据并得到以下错误

Parse error on line 1:
"{    \"status\": \
^
Expecting '{', '['

有什么想法吗?

放弃
json\u解码
-只需保存并读取原始的json即可。

如果需要
json\u解码结果并处理结果,则需要
序列化
取消序列化
数据

一种拯救的方法

file_put_contents('properties.txt', serialize(json_decode($result)));
加载

$result = unserialize(file_get_contents('properties.txt'));
这将确保数据结构在不同的运行中正确保存。当存储为JSON时,除非指定,否则JSON对象是PHP对象还是关联数组都不清楚<代码>序列化
没有此问题

json_decode()将返回一个数组或对象(一般来说)。不能只将该数组/对象写入文件。在字符串上下文中编写数组只会得到字面单词
array

为什么不直接写出原始JSON文本呢

file_put_contents('cache.json', file_get_contents($url));
然后

$data = json_decode(file_get_contents('cache.json'));

每次解码都需要花费一些cpu时间,但至少可以获得真实数据,而不是损坏的
数组
或其他任何东西。

尝试此操作-警告:json_decode()要求参数1为字符串,第26行的/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php中给出的对象警告:第44行的/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php中为foreach()提供的参数无效。为什么在这里不必要地混合序列化?只是额外的开销。PHP处理JSON编码的数据时,绝对没有对象与关联数组之间的歧义,因为JSON中没有关联数组结构。当开发人员希望使用
json\u decode()
选项强制关联数组而不一致时,就会出现歧义。如果不深入研究这个选项,PHP只会将JSON反序列化为对象和数字索引数组。特别是在这种情况下,您所要做的就是创建JSON文件的本地副本为什么要更改它?警告:为foreach()提供的参数无效在第44行的/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php中,执行此操作时,json会完美地显示在文本文件中,但在获取数据和数组时,我会收到警告:第27行的/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php中的非法字符串偏移量“properties”警告:参数无效为第43行/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php中的foreach()提供,这是因为您试图循环原始数据。您需要先读取它,然后对原始数据进行
json\u解码
,然后才能在PHP中循环。