2013年3月1日金曜日

で結局、JSONPathのラッパークラスを書く。。(2)

●使い方サンプル
まぁ問題は、JSONPathのpathの文字列に慣れてないことくらい^^;^^;
 
 $p = new gJPath;
 $jstr = file_get_contents(******************);
 $json = json_decode($jstr,true);

 $p->setJson($json);
// $p->json = json_decode($jstr,true); //まぁこれでも同じですが。。

 $xpath = "$..name";
 $v = $p->getValueOne($xpath); // 所得

 $xpath = "$..layers.[*].name";
 $v = $p->getValueOne($xpath); // 所得

 $xpath = "$..imgurl";
 $v = $p->getValueOne($xpath); // 所得

 $xpath = "$..layers.[*].name"; // 配列として所得
 $v = $p->getValue($xpath);
 foreach($v as $one) echo "【{$one}】";//表示させてみたりとか

 $xpath = "$..layers.[*].name";
 $v = $p->getPathOne($xpath);

 $xpath = "$..layers.[*].items[?(@['name']=='札文字')]";
 $v = $p->getValueOne($xpath); // 所得
 $v = $p->getValue($xpath); // 配列として所得

 $xpath = "$..name";
 $p->setValue($xpath,"new 'Name' DA\\YO!");//一括更新

 $xpath = "$..items[?(@['name']=='札文字')]";
 $patstr = $p->getPathOne($xpath);
 $patstr .= "['mtext']";
 $v = $p->getValueDirect($patstr);  // patstrから値を所得
 $p->setValueDirect($patstr,"でへへへ!");// patstrから値を設定
 $v = $p->getValueDirect($patstr); // patstrから値を所得(当然かわっている)
●クラス
 require_once "./jsonpath-0.8.1.php";
 //---------------------------------------
class gJPath{
 public $json;   // object
 //-------------------------
 /* 初期値 */
 //-------------------------
 function __construct(){
  $this->json = null;
 }
 //-------------------------
 // objectをセットする
 //-------------------------
 public function setJson(&$v){
  $this->json = &$v; // ここで&を忘れちゃダメよ。
 }
 //-------------------------
 function __destruct(){
  // とりあえず特にやることなし。
 }
 //-------------------------
 // マッチしたものを返す。
 // falseでなければ、Arrayを返す
 //-------------------------
 public function getValue($pat){
  $match = jsonPath($this->json, $pat);
  return $match;
 }
 //-------------------------
 // マッチしたものを返す。
 // falseか値かどっちかを返す。
 // $patが必ず1コか0コが確定している場合とかに使う。
 //-------------------------
 public function getValueOne($pat){
  $match = $this->getValue($pat);
  if($match == false) return false;
  return $match[0];
 }
 //-------------------------
 // マッチしたPATHを返す。
 // falseでなければ、Arrayを返す
 //-------------------------
 public function getPath($pat){
  $match = jsonPath($this->json, $pat, array("resultType" => "PATH"));
  return $match;
 }
 //-------------------------
 // 
 //-------------------------
 public function getPathOne($pat){
  $match = $this->getPath($pat);
  if($match == false) return false;
  return $match[0];
 }
 //-------------------------
 // マッチするものに全て値を設定する。
 //-------------------------
 public function setValue($pat,$value){
  $match = $this->getPath($pat);
  if($match != false){
   foreach($match as $u){
    $this->setValueDirect($u,$value);
   }
  }
 }
 //-------------------------
 // 【$['abc'][0]】のような文字列と値を引数にしてセットする。
 // arrayとかをvalueにするなよ!
 // $pathはパターンじゃないから注意!
 //-------------------------
 public function setValueDirect($path,$value){
  $evalstr = "\x24this->json" . substr($path,1);
  $valuestr = "";
  if(is_string($value)){
   $value = preg_replace("/\x5c\x5c/", "\x5c\x5c\x5c\x5c",$value);  // 【\】 を 【\\】 にする
   $value = preg_replace("/\x27/",  "\x5c\x27",$value);    // 【'】 を 【\'】 にする
   $valuestr = "'{$value}'";
  }else{
   $valuestr = "{$value}";
  }
  @eval("{$evalstr}={$valuestr};");
 }
 //-------------------------
 // $pathはパターンじゃないから注意!
 //-------------------------
 public function getValueDirect($path){
  $evalstr = "\x24this->json" . substr($path,1);
  @eval("\x24v={$evalstr};");
  return $v;
 }
 //-------------------------

0 件のコメント:

コメントを投稿