2014-12-02 2 views
2

문제가 있습니다.PHP API가 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']); 

     } 
    } 
} 

을 표시 할 수 있습니다이 작동합니다.

나는 다음 시도하고 괜찮 파일에 데이터를 저장

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

와 함께 텍스트 파일로 JSON을 저장합니다. 그러나 그것을 읽으려고 할 때, 나는 무엇을 시도하든 무작위로 오류를 얻습니다. 누군가가 텍스트 파일을 읽고 배열을 출력하는 것을 도와 줄 수 있습니까? JSONLint와

나는 데이터를 확인하고 다음과 같은 오류

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

어떤 아이디어를 얻을?

답변

3

도끼 - 그냥 원시 JSON을 저장하고 읽습니다.

+0

json이 텍스트 파일에 완벽하게 표시되지만 데이터와 배열을 가져 오는 경우 경고 : 잘못된 문자열 오프셋 'properties'in /var/sites/s/steve-morris1.co.uk/public_html/ new/inc/properties.php on line 27 경고 : 잘못된 인수가 /var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php의 43 행에있는 foreach()에 제공되었습니다. – James

+0

원시 데이터를 반복하려고하기 때문입니다. PHP에서 루프하기 전에 원시 데이터에서'json_decode'를 읽어야합니다. –

-1

결과가 이고 결과가 작동해야하는 경우 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이 string이어야한다고 가정합니다. 객체는 /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()에 대해 잘못된 인수가 제공되었습니다. – James

+0

여기에 불필요하게 일련 번호를 혼합하는 이유는 무엇입니까? 그냥 여분의 오버 헤드. JSON에서 연관 배열 구문과 같은 것이 없기 때문에, PHP가 객체 대 결합 배열과 관련하여 JSON으로 인코딩 된 데이터를 처리하는 방법에는 절대 모호성이 없습니다. 애매한 점은 개발자가'json_decode()'옵션을 사용하여 연관 배열을 강제하고 일관되게하지 않으려는 경우에 존재합니다. 이 옵션을 선택하지 않으면 PHP는 JSON을 객체와 숫자로 색인화 된 배열로만 비 직렬화합니다. 이 경우 특히, JSON 파일의 로컬 복사본을 만들어야 만 변경하려고합니다. –

+0

경고 : /var/sites/s/steve-morris1.co.uk/public_html/new/inc/properties.php의 44 번째 줄에서 foreach()에 잘못된 인수가 제공되었습니다. – James

3

json_decode()는 배열 또는 객체 (일반적으로 말하면)를 반환합니다. 해당 배열/객체를 파일에 쓸 수는 없습니다. 문자열 컨텍스트로 배열을 작성하면 문자 그대로 Array이라는 단어가 생깁니다.

왜 원시 JSON 텍스트를 작성하지 않는가?

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

다음

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

당신은 디코딩마다하고 CPU 시간의 비트를 보낼 것이다, 그러나 적어도 당신은 실제 데이터를 얻을 수 있습니다, 그리고 손상된 Array 또는 무엇 이건.

관련 문제