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