2011-04-22 50 views
1

我使用JSONPath與PHP,我需要的xpath等效於包含過濾器,「contains(dept,'Management')」;PHP JSONPath,XPath包含過濾器

我有以下的JSON,我只想過濾員工到管理部門。如果部門節點只包含1個部門,那麼它沒有問題,但我需要在部門字符串中找到關鍵字?

任何幫助,將不勝感激。

{ 
    "staff": { 
     "members": [ 
      { 
      "firstname": "J", 
       "lastname": "H", 
       "department": "Management, Finance" 
      }, 
      { 
       "firstname": "S", 
       "lastname": "M", 
       "department": "Finance" 
      } 
     ] 
    } 
} 

$parser->setPath("$..members[?(@['department']=='Management')]"); 
$staff = $parser->getData(); 
var_dump($staff); 

回答

0

我設法弄清楚了這一點。在http://jsonpath.googlecode.com/svn/trunk/tests/jsonpath-test-php.php中有一些使用PHP strpos的例子,但是這對我最初使用jsonpath-0.8.1.php不起作用。

我給jsonpath-0.8.3.php發現倉庫和對strpos表達完美工作: -

$..members[?(@ && @['department'] && strpos(@['department'],'".$dept."')!==false)] 

注意,功能evalx()有這會導致錯誤的第三個參數,設定值爲null工作正常,看http://code.google.com/p/jsonpath/issues/detail?id=8

function evalx($x, $v, $vname=null) 
2

看這個

JSONPath :contains filter

我會假設你的情況時便會像。

"$..members[?(/Management/.test(@['department']))"; 
+0

我試過 「$ ..會員[?(/管理/(@ '部門']))」,但不知道格式,我會更換什麼的。測試與?這是特定於javaScript嗎? – rossjha 2011-04-22 12:55:41

+0

@rossjha耶,它是JavaScript特定的。我不知道你使用的是什麼PHP的xpath.php解析器,但看看他們提供了什麼表達式,並且如果有什麼'like'或者像上面的例子那樣你可以使用正則表達式(test是一個函數) – 2011-04-22 13:40:50

+0

Thanks Eliijan,in在這裏找到的例子: - http://jsonpath.googlecode.com/svn/trunk/tests/jsonpath-test-php.php有strpos正在使用的例子,我可以看到在jsonpath.php文件中有一個eval函數,但仍然堅持語法。試過以下內容:「$ .. members。[?(@ && @ [\'department \'] && strpos(@ [\'department \',\'Management \')!== false)]」但不是喜悅。按照建議使用Michal Migurski的JSON解析器,所以我也要看看這個。 – rossjha 2011-04-22 13:43:13