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

时间:2014-12-02 21:21:46

标签: php json

遇到麻烦。

基本上,我正在尝试访问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']); 

        }
    }
}

这可行。

然后尝试使用

将json保存到文本文件中
file_put_contents('properties.txt', json_decode($result));

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

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

json_decode()将返回一个数组或对象(一般来说)。您不能只将该数组/对象写入文件。在字符串上下文中编写数组只会为您提供文字Array

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

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

然后

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

每次花费一些cpu时间进行解码,但至少你会获得真实数据,而不是损坏的Array或其他任何内容。

答案 2 :(得分:-1)

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

保存的一种方法......

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

装载...

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

这将确保数据结构在运行期间正确保留。当存储为JSON时,除非指定,否则JSON对象是PHP对象还是关联数组是不清楚的。 serialize没有此问题。