2013-11-12 2 views
0

Я пытаюсь обработать некоторые декодированные данные json с использованием PHP-реализации JSONPath (http://goessner.net/articles/JsonPath/).Использовать JSONPath для установки значения в массиве

Я в порядке с использованием выражения для вывода данных в декодированном JSON, но я хотел бы иметь возможность устанавливать данные с использованием выражения JSONPath. Кто-нибудь мог сделать это на PHP, используя JSONPath, если да, то как?

ответ

2

Похоже, что эта реализация JSONPath не поддерживает заданные операции.

Я написал простую функцию, которая может быть добавлена ​​в 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; 
    } 
} 

Благодаря Майк Брант за предложения!

+0

Рад видеть, что вы придумали решение. Вы можете подумать о том, чтобы добавить его как метод к самому объекту JsonPath и передать его обратно в либрару для будущего использования другими. Было бы неплохо иметь что-то вроде '$ jsonPath-> set ($ expr, $ value)' как сигнатуру метода, которая будет работать с текущим объектом JsonPath. –

1

Вкратце рассмотрев документацию, похоже, что JSONPath не поддерживает операции набора. Если бы кто-то был настолько склонен, я бы предположил, что вы могли бы модифицировать JSONPath для необязательного возврата массива указателей (например, ссылок на объекты) в качестве resultType, чтобы вы могли напрямую управлять этими значениями.

+0

Спасибо, это то, что я подозревал, но я надеялся, что это не так! Я посмотрю, смогу ли я его обновить. – JMac

+0

@JMac В качестве альтернативы, можно также реализовать более сложный метод набора множеств в библиотеке. Это, честно говоря, может оказаться похожим или более эффективным по производительности на создание набора ссылок, а затем действовать против этого набора. –

+0

Приветствия за предложения, я опубликовал одно решение в другом ответе. – JMac