Запрос JSONPath для получения Node -names?

Рассмотрим следующий фрагмент JSONPath:

{
   "result":[
      {
         "type":"Residence",
         "street":"Piazza di Spagna",
         "city":"-4:0"
      },
      {
         "type":"Residence",
         "street":"test",
         "city":"-4:1"
      }
   ]
}

Можно ли получить список всех node -names?
Так, например, мне нужен список, например: type, street, city.

Ответ 1

Попробуйте

$arr = (json_decode($json)->result[0]);
 $array = get_object_vars($arr);
 $properties = array_keys($array);
 print_r($properties);`

Out put будет

Array
(
    [0] => type
    [1] => street
    [2] => city
)

Ответ 2

В PHP >= 5.4 вы можете получить свои ключи с одной строкой кода:

$nodeNames = array_keys( json_decode( $jsonString, True )['result'][0] );

демонстрация eval.in

В более низких версиях (PHP >= 5.2.16) вам нужно разбить код в двух строках:

$array = json_decode( $jsonString, True );
$nodeNames = array_keys( $array['result'][0] );

Я декодирую строку JSON со вторым параметром как True, чтобы заставить результат как массив, затем я вызываю array_keys для получения ключей array['result'][0].

Изменить: больше гибкости

Ваш пример может быть обработан, как указано выше, без проблем, но что произойдет, если в исходной строке JSON есть разные ключи? Вышеупомянутое решение не будет выполнено, если в первой строке result не все ключи. Чтобы получить ключи all, вы можете использовать этот код:

$array  = json_decode( $jsonString, True );
$nodeNames = array();
foreach( $array['result'] as $row )
{
    $nodeNames = array_unique( array_merge( $nodeNames, array_keys( $row ) ) );
}

демо eval.in

или, используя array_filter, с помощью этого кода:

$array  = json_decode( $jsonString, True );
$nodeNames = array();
array_filter
(
    $array['result'], 
    function( $row )
    {
        global $nodeNames;
        $nodeNames = array_unique( array_merge( $nodeNames, array_keys( $row ) ) );
    }
);

В этих двух эквивалентных примерах я обрабатываю каждую строку result, объединяя ключи в массиве $nodeNames и используя array_unique для удаления повторяющихся ключей.


Ответ 3

Вы можете использовать следующую функцию для печати всех ключей в формате массива

print_r (array_keys ($ массив));

Ответ 4

Является ли путь JSON определенно следовать этой структуре каждый раз? Как и в Result = > Массивы, все из которых имеют одинаковые узлы.

Если это произойдет, то будет работать следующее:

function getJsonNodes($json) {
    $nodes   = array();
    $decoded = json_decode($json, true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new \InvalidArgumentException('Invalid JSON String passed to getJsonNodes()');
    }

    $result = $decoded['result'];
    if (is_array($result)) {
        $nodes = array_keys($result[0]);
    }

    return $nodes;
}

Использование будет примерно таким:

try {
    $nodes = getJsonNodes($json);
} catch (\InvalidArgumentException $e) {
    echo $e->getMessage();
}

означает, что вы можете поймать любые недопустимые строки JSON, которые могут быть переданы и запутаться с выходом.

Хотя, как я сказал, вышеупомянутое решение будет работать только в том случае, если ваш JSON-путь следует структуре, чтобы вставить ваш OP.

Вы можете увидеть его здесь: https://ideone.com/dlvdu2

Надеюсь, что это поможет в любом случае.

Ответ 5

Можно ли получить список all the node-names?

$object = json_decode($json);
$json_array = $object->result;
foreach ($json_array as $key => $value) {
    $object_var = get_object_vars($value);
    $object_key = array_keys($object_var);
    var_dump($object_key);//will get all node_names!
}

Ответ 6

Попробуйте это

$result[0].type , $result[0].street, $result[0].city

Ответ 7

Вы можете преобразовать строку JSON в массив PHP через json_decode. Затем просто используйте array_keys для каждого node

Ответ 8

Пожалуйста, ознакомьтесь с приведенным ниже кодом.. Надеемся работать

<?php
$text[]=array(
            result=>array(
                "type"=>"Residence",
                "street"=>"pizza",
                "city"=>"ini"
            ),
            array(
                "type"=>"Residence",
                "street"=>"pizza",
                "city"=>"ini"
            )
        );

echo json_encode($text);
?>