我尝试使用JSONPath的PHP实现(http://goessner.net/articles/JsonPath/)处理一些已解码的json数据。
我可以使用表达式在解码的JSON中查找数据,但我希望能够使用JSONPath表达式设置数据。有没有人能够使用JSONPath在PHP中执行此操作,如果是这样,怎么做?
答案 0 :(得分:2)
似乎JSONPath的这个实现不支持set操作。
我编写了一个简单的函数,可以添加到jsonPath.php来添加此功能。我把它贴在这里以防它可能对其他人有用:
/**
* @param array $obj Decoded json file to alter
* @param string $expr JSONPath expression (http://goessner.net/articles/JsonPath/)
* @param mixed $value Value to set all matching entries to
*/
function jsonPathSet(&$obj, $expr, $value)
{
$paths = jsonPath($obj, $expr, array('resultType' => 'PATH'));
$jsonPath = new JsonPath();
foreach ($paths as $path) {
$p = $jsonPath->normalize($path);
$keys = explode(';', $p);
$current = &$obj;
foreach ($keys as $key) {
if($key=='$') {
continue;
} else if (is_array($current)) {
$current = &$current[$key];
} else {
$current = &$current->$key;
}
}
$current = $value;
}
}
感谢Mike Brant的建议!
答案 1 :(得分:1)
简要地看一下文档,看起来JSONPath似乎不支持set操作。如果有人如此倾向,我想你可以修改JSONPath以选择性地返回一个指针数组(即对象引用)作为resultType
,这样你就可以直接操作这些值。