使用JSONPath在数组中设置值

时间:2013-11-12 16:30:02

标签: php json jsonpath

我尝试使用JSONPath的PHP实现(http://goessner.net/articles/JsonPath/)处理一些已解码的json数据。

我可以使用表达式在解码的JSON中查找数据,但我希望能够使用JSONPath表达式设置数据。有没有人能够使用JSONPath在PHP中执行此操作,如果是这样,怎么做?

2 个答案:

答案 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,这样你就可以直接操作这些值。