Ответ 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
)
Рассмотрим следующий фрагмент JSONPath:
{
"result":[
{
"type":"Residence",
"street":"Piazza di Spagna",
"city":"-4:0"
},
{
"type":"Residence",
"street":"test",
"city":"-4:1"
}
]
}
Можно ли получить список всех node -names?
Так, например, мне нужен список, например: type, street, city.
Попробуйте
$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
)
В PHP >= 5.4 вы можете получить свои ключи с одной строкой кода:
$nodeNames = array_keys( json_decode( $jsonString, True )['result'][0] );
В более низких версиях (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 ) ) );
}
или, используя 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
для удаления повторяющихся ключей.
Вы можете использовать следующую функцию для печати всех ключей в формате массива
print_r (array_keys ($ массив));
Является ли путь 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
Надеюсь, что это поможет в любом случае.
Можно ли получить список 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!
}
Попробуйте это
$result[0].type , $result[0].street, $result[0].city
Вы можете преобразовать строку JSON в массив PHP через json_decode. Затем просто используйте array_keys для каждого node
Пожалуйста, ознакомьтесь с приведенным ниже кодом.. Надеемся работать
<?php
$text[]=array(
result=>array(
"type"=>"Residence",
"street"=>"pizza",
"city"=>"ini"
),
array(
"type"=>"Residence",
"street"=>"pizza",
"city"=>"ini"
)
);
echo json_encode($text);
?>