2013年3月1日金曜日

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

●使い方サンプル
まぁ問題は、JSONPathのpathの文字列に慣れてないことくらい^^;^^;
  1.    
  2.  $p = new gJPath;  
  3.  $jstr = file_get_contents(******************);  
  4.  $json = json_decode($jstr,true);  
  5.   
  6.  $p->setJson($json);  
  7. // $p->json = json_decode($jstr,true); //まぁこれでも同じですが。。  
  8.   
  9.  $xpath = "$..name";  
  10.  $v = $p->getValueOne($xpath); // 所得  
  11.   
  12.  $xpath = "$..layers.[*].name";  
  13.  $v = $p->getValueOne($xpath); // 所得  
  14.   
  15.  $xpath = "$..imgurl";  
  16.  $v = $p->getValueOne($xpath); // 所得  
  17.   
  18.  $xpath = "$..layers.[*].name"// 配列として所得  
  19.  $v = $p->getValue($xpath);  
  20.  foreach($v as $one) echo "【{$one}】";//表示させてみたりとか  
  21.   
  22.  $xpath = "$..layers.[*].name";  
  23.  $v = $p->getPathOne($xpath);  
  24.   
  25.  $xpath = "$..layers.[*].items[?(@['name']=='札文字')]";  
  26.  $v = $p->getValueOne($xpath); // 所得  
  27.  $v = $p->getValue($xpath); // 配列として所得  
  28.   
  29.  $xpath = "$..name";  
  30.  $p->setValue($xpath,"new 'Name' DA\\YO!");//一括更新  
  31.   
  32.  $xpath = "$..items[?(@['name']=='札文字')]";  
  33.  $patstr = $p->getPathOne($xpath);  
  34.  $patstr .= "['mtext']";  
  35.  $v = $p->getValueDirect($patstr);  // patstrから値を所得  
  36.  $p->setValueDirect($patstr,"でへへへ!");// patstrから値を設定  
  37.  $v = $p->getValueDirect($patstr); // patstrから値を所得(当然かわっている)  
●クラス
  1.  require_once "./jsonpath-0.8.1.php";  
  2.  //---------------------------------------  
  3. class gJPath{  
  4.  public $json;   // object  
  5.  //-------------------------  
  6.  /* 初期値 */  
  7.  //-------------------------  
  8.  function __construct(){  
  9.   $this->json = null;  
  10.  }  
  11.  //-------------------------  
  12.  // objectをセットする  
  13.  //-------------------------  
  14.  public function setJson(&$v){  
  15.   $this->json = &$v; // ここで&を忘れちゃダメよ。  
  16.  }  
  17.  //-------------------------  
  18.  function __destruct(){  
  19.   // とりあえず特にやることなし。  
  20.  }  
  21.  //-------------------------  
  22.  // マッチしたものを返す。  
  23.  // falseでなければ、Arrayを返す  
  24.  //-------------------------  
  25.  public function getValue($pat){  
  26.   $match = jsonPath($this->json, $pat);  
  27.   return $match;  
  28.  }  
  29.  //-------------------------  
  30.  // マッチしたものを返す。  
  31.  // falseか値かどっちかを返す。  
  32.  // $patが必ず1コか0コが確定している場合とかに使う。  
  33.  //-------------------------  
  34.  public function getValueOne($pat){  
  35.   $match = $this->getValue($pat);  
  36.   if($match == falsereturn false;  
  37.   return $match[0];  
  38.  }  
  39.  //-------------------------  
  40.  // マッチしたPATHを返す。  
  41.  // falseでなければ、Arrayを返す  
  42.  //-------------------------  
  43.  public function getPath($pat){  
  44.   $match = jsonPath($this->json, $pat, array("resultType" => "PATH"));  
  45.   return $match;  
  46.  }  
  47.  //-------------------------  
  48.  //   
  49.  //-------------------------  
  50.  public function getPathOne($pat){  
  51.   $match = $this->getPath($pat);  
  52.   if($match == falsereturn false;  
  53.   return $match[0];  
  54.  }  
  55.  //-------------------------  
  56.  // マッチするものに全て値を設定する。  
  57.  //-------------------------  
  58.  public function setValue($pat,$value){  
  59.   $match = $this->getPath($pat);  
  60.   if($match != false){  
  61.    foreach($match as $u){  
  62.     $this->setValueDirect($u,$value);  
  63.    }  
  64.   }  
  65.  }  
  66.  //-------------------------  
  67.  // 【$['abc'][0]】のような文字列と値を引数にしてセットする。  
  68.  // arrayとかをvalueにするなよ!  
  69.  // $pathはパターンじゃないから注意!  
  70.  //-------------------------  
  71.  public function setValueDirect($path,$value){  
  72.   $evalstr = "\x24this->json" . substr($path,1);  
  73.   $valuestr = "";  
  74.   if(is_string($value)){  
  75.    $value = preg_replace("/\x5c\x5c/""\x5c\x5c\x5c\x5c",$value);  // 【\】 を 【\\】 にする  
  76.    $value = preg_replace("/\x27/",  "\x5c\x27",$value);    // 【'】 を 【\'】 にする  
  77.    $valuestr = "'{$value}'";  
  78.   }else{  
  79.    $valuestr = "{$value}";  
  80.   }  
  81.   @eval("{$evalstr}={$valuestr};");  
  82.  }  
  83.  //-------------------------  
  84.  // $pathはパターンじゃないから注意!  
  85.  //-------------------------  
  86.  public function getValueDirect($path){  
  87.   $evalstr = "\x24this->json" . substr($path,1);  
  88.   @eval("\x24v={$evalstr};");  
  89.   return $v;  
  90.  }  
  91.  //-------------------------  

0 件のコメント:

コメントを投稿