我正在尝试使用jsonpath在PHP中解析JSON。
我的JSON就是从这里来的
https://servizionline.sanita.fvg.it/tempiAttesaService/tempiAttesaPs
(it在这里剪切/粘贴太长了,但是你可以在浏览器会话中看到它…)
JSON是一个有效的JSON(我已经使用https://jsonlint.com/验证了它...).
我已经使用http://www.jsonquerytool.com/尝试了jsonpath表达式,一切似乎都很好,但当我把所有的PHP代码示例放在下面时....
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
require_once('json.php'); // JSON parser
require_once('jsonpath-0.8.0.php'); // JSONPath evaluator
$url = 'https://servizionline.sanita.fvg.it/tempiAttesaService/tempiAttesaPs';
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_PROXY, '');
$data = curl_exec($ch);
curl_close($ch);
$parser = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
$o = $parser->decode($data);
$xpath_for_parsing = '$..aziende[?(@.descrizione=="A.S.U.I. - Trieste")]..prontoSoccorsi[?(@.descrizione=="Pronto Soccorso e Terapia Urgenza Trieste")]..dipartimenti[?(@.descrizione=="Pronto Soccorso Maggiore")]..codiciColore[?(@.descrizione=="Bianco")]..situazionePazienti..numeroPazientiInAttesa';
$match1 = jsonPath($o, $xpath_for_parsing);
//print_r($match1);
$match1_encoded = $parser->encode($match1);
print_r($match1_encoded);
$match1_decoded = json_decode($match1_encoded);
//print_r($match1_decoded);
if ($match1_decoded[0] != '') {
return $match1_decoded[0];
}
else {
return "N.D.";
}
?>
...不打印任何值..只有一个“假”值。
当我将jsonpath表达式放入PHP代码中时,它出现了错误:出现的错误如下
Warning: Missing argument 3 for JsonPath::evalx(), called in /var/www/html/OpenProntoSoccorso/Test/jsonpath-0.8.0.php on line 84 and defined in /var/www/html/OpenProntoSoccorso/Test/jsonpath-0.8.0.php on line 101
Notice: Use of undefined constant descrizione - assumed 'descrizione' in /var/www/html/OpenProntoSoccorso/Test/jsonpath-0.8.0.php(104) : eval()'d code on line 1
也许我必须转义/引用我的jsonpath才能在PHP中使用它,但我不知道如何...任何建议都很感激…
注意:我需要使用像?(@.descrizione=="A.S.U.I. - Trieste")
这样的jsonpath表达式,我不能使用“位置”json path...
我也试过使用jsonpath-0.8.3.php来自这里https://github.com/ITS-UofIowa/jsonpath/blob/master/jsonpath.php,但没有什么变化...
有什么建议吗
感谢你的评分
4条答案
按热度按时间chhkpiq41#
q7solyqu2#
你可以使用json_decode将其转换为原生php数组,然后你可以使用hhb_xml_encode(来自https://stackoverflow.com/a/43697765/1067003)将数组转换为xml,然后你可以使用DOMDocument::loadHTML将XML转换为DOMDocument,然后你可以使用DOMXPath::query通过XPath搜索它...
示例:
ps,
require_once ('hhb_.inc.php'); $json_raw = (new hhb_curl ( '', true ))->exec ( 'https://servizionline.sanita.fvg.it/tempiAttesaService/tempiAttesaPs' )->getStdOut ();
行只是获取url并将json放入$json_raw中(使用gzip压缩传输来加快速度),将其替换为您想要将其获取到$json_raw中的任何内容,我使用的实际curl库来自https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php#L477目前它打印:
希望这就是你要找的,我猜是通过你提供的“xpath”。
pkln4tw63#
xpath对于你的任务来说太复杂了,而且通常都是矫枉过正……
只需使用标准的
json_decode()
,获取等效的PHP对象,并使用标准的for/while循环和正则表达式导航它另外,我认为你的问题是误导,你的问题不是解析JSON(这是由
json_decode()
自动完成的),你的问题是使用xpath从中提取一些数据。我建议对你的问题进行重构,以准确地显示出哪里出了问题,以及你的意图是什么如果你需要下降到一个精确的JSON节点(或一组节点),为什么不使用for循环和正则表达式呢?
4uqofj5v4#
我已经解决了更改JsonPath的库实现:现在我使用Skyscanner JsonPath实现(参考https://github.com/Skyscanner/JsonPath-PHP)。
安装上有些麻烦(对我来说,我以前从来没有使用过composer...),但skyskanner团队支持我(参考。https://github.com/Skyscanner/JsonPath-PHP/issues/6),现在我有这个PHP代码...
在
./tmp
中,我有从Composer获得内容这样我就可以做我的json查询了,可能不需要知道它的确切结构