金曜日, 10月 11, 2013

PHP 取ってきたJSONのVALUEにNULLが入ってて配列に変換できなくて困っていたが力づくで代入するテスト

一部VALUEにデータがない(NULL)JSONをPHPで配列に変えて処理しようとしたとき、
json_decodeで変換できず、そのままでデータを参照しようとすると
「PHP Notice:  Trying to get property of non-object in test.php on line xx」
のように怒られます。
そこをなんとかしたのでログを残す方向で。


■サンプルJSON
{"remoteip":"x.x.x.x","AAA":141,"BBB":,"CCC":140,"DDD":}
 ⇒BBBとDDDのValueに何も入ってないので、json_decodeできない。


■対応策
NULLを0に変換します!ただし力ずく
※もっとスマートなやり方があればだれか教えてください…



■サンプルコード
<?php
// json format
$url = 'http://www.xxx.com/system?source=json';
$json = file_get_contents($url);
// $json = '{"remoteip":"x.x.x.x","AAA":141,"BBB":,"CCC":140,"DDD":}';
// transform NULL to 0
$replaceText1 = str_replace(":,",":0,",$json);
$replaceText2 = str_replace(":}",":0}",$replaceText1);
// json_decode
$array_test=json_decode($replaceText2, true);
// array check
if (is_array($array_test)){
   }else{
      print('Array NG');
      print($json);
      print($replaceText1);
      print($replaceText2);
      exit;
}
//  Check!
$Value = $array_test['BBB'];
print "BBB = $Value \n";
exit;
?>

■解説付き
<?php
// json format
$url = 'http://www.xxx.com/system?source=json';    // 適当なURLです。
$json = file_get_contents($url);                   // JSONをダウンロードします。
// $json = '{"remoteip":"x.x.x.x","AAA":141,"BBB":,"CCC":140,"DDD":}'; //直接指定する場合はこちらを利用してください。
// transform NULL to 0
$replaceText1 = str_replace(":,",":0,",$json);          // ":,"を":0,"に変換します。
$replaceText2 = str_replace(":}",":0}",$replaceText1);  // "":}"を":0}"に変換します。
// json_decode
$array_test=json_decode($replaceText2, true);       // JSONをtrue付きで連想配列に変換します。
// array check
if (is_array($array_test)){   // Arrayになっているか確認します。
   }else{                     // 正常系はなにもしません。
      print('Array NG');      // debug用に各種変数を表示します。
      print($json);           // 変数を表示しているだけなので問題無し。
      print($replaceText1);
      print($replaceText2);   // ここでJSONが正しくないと、json_decodeで変換できません。
      exit;                   // 異常時はプログラムを停止します。
}
//  Check!
$Value = $array_test['BBB'];  // 配列array_testのBBBから、値を取得し Valueに代入します。
print "BBB = $Value \n";      // 結果を表示します。
exit;
?>