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

问题描述:

遇到问题。PHP API将JSON保存到文件,然后读取文件

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

无论如何,我已经登录到API并且检索了数据,并且可以显示没有问题的“live”数据。

尝试保存数据并从文本文件中读取时出现故障。这是一个多深度数组。

的retreiving代码

$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']); 

     } 
    } 
} 

和工作原理。

我再尝试和JSON保存到一个文本文件

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

这将文件保存好数据。但是当试图从中读取时,无论我尝试什么,我都会得到随机错误。有人可以帮助阅读文本文件并输出数组吗?

随着JSONLint我验证数据,并得到以下错误

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

任何想法?

json_decode - 只需保存并阅读原始的JSON。

+0

时做了JSON是在文本文件中显示完美,但得到的数据和数组我得到警告的时候:在/var/sites/s/steve-morris1.co.uk/public_html/非法串偏移“属性”上线新的/ INC/properties.php 27 警告:()在/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php提供的foreach无效参数上线43 – James 2014-12-02 21:51:07

+0

这是因为您正在尝试循环原始数据。您需要阅读它,*然后*在原始数据上执行'json_decode',然后才能在PHP中循环。 – 2014-12-02 23:15:10

如果您需要json_decode结果并使用结果,您需要serializeunserialize的数据。

的一种方式,以节省...

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

加载...

$result = unserialize(file_get_contents('properties.txt')); 

这将确保从正确运行保存的数据结构来运行。当以JSON格式存储时,除非指定,否则JSON对象是PHP对象还是关联数组都不清楚。 serialize没有这个问题。

+0

尝试这个我得到 - 警告:json_decode()期望参数1是字符串,对象在/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php 26行 警告:/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php为的foreach()提供在线44 – James 2014-12-02 21:44:11

+0

为什么这里不必要的混合序列化的参数无效?只是额外的开销。有绝对如何NO歧义PHP对待与关于对象与关联数组JSON编码的数据,因为有作为关联数组中JSON构造没有这样的事情。当开发人员想使用'json_decode()'选项强制关联数组,不要做它一贯的不确定性存在。没有深入研究这个选项,PHP只会将JSON反序列化为对象和数字索引数组。特别是在这种情况下,你所要做的就是制作JSON文件的本地副本,为什么要改变它? – 2014-12-02 21:44:32

+0

警告:在/var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php为的foreach()供给线44无效的参数 – James 2014-12-02 21:46:11

json_decode()将返回一个数组或对象(一般来说)。你不能只把这个数组/对象写到一个文件中。在字符串上下文中编写数组只会给你字面上的单词Array

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

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

然后

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

你会花一点的CPU时间做每次解码,但至少你会得到真实的数据,而不是破坏Array或什么的。