まぁ問題は、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 件のコメント:
コメントを投稿