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