考虑以下JSONPath:
{
"result":[
{
"type":"Residence",
"street":"Piazza di Spagna",
"city":"-4:0"
},
{
"type":"Residence",
"street":"test",
"city":"-4:1"
}
]
}
是否可以获取所有节点名称的列表?
例如,我想要一个列表,如:type,street,city。
答案 0 :(得分:4)
试试这个
$arr = (json_decode($json)->result[0]);
$array = get_object_vars($arr);
$properties = array_keys($array);
print_r($properties);`
输出将是
Array
(
[0] => type
[1] => street
[2] => city
)
答案 1 :(得分:4)
在PHP> = 5.4上,您可以使用一行代码获取密钥:
$nodeNames = array_keys( json_decode( $jsonString, True )['result'][0] );
的 eval.in demo 强>
在较低版本(PHP> = 5.2.16)上,您必须将代码分成两行:
$array = json_decode( $jsonString, True );
$nodeNames = array_keys( $array['result'][0] );
我用第二个参数解码JSON字符串为True以强制结果为数组,然后我调用array_keys
来获取array['result'][0]
的键。
您的示例可以像上面一样处理而没有问题,但如果原始JSON字符串具有不同的键会发生什么?如果在第一个result
行中没有所有键,则上述解决方案将失败。要获得所有键,您可以使用以下代码:
$array = json_decode( $jsonString, True );
$nodeNames = array();
foreach( $array['result'] as $row )
{
$nodeNames = array_unique( array_merge( $nodeNames, array_keys( $row ) ) );
}
的 eval.in demo 强>
或使用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
删除重复键。
答案 2 :(得分:1)
您可以使用以下功能以数组格式打印所有键
的print_r(array_keys($阵列));
答案 3 :(得分:1)
JSON Path 肯定每次都会遵循该结构吗?如在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
希望它能有所帮助。
答案 4 :(得分:0)
是否可以获得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!
}
答案 5 :(得分:-1)
试试这个
$result[0].type , $result[0].street, $result[0].city
答案 6 :(得分:-2)
您可以通过json_decode将JSON字符串转换为PHP数组。然后只为每个节点使用array_keys
答案 7 :(得分:-2)
请检查以下代码..希望能够工作
<?php
$text[]=array(
result=>array(
"type"=>"Residence",
"street"=>"pizza",
"city"=>"ini"
),
array(
"type"=>"Residence",
"street"=>"pizza",
"city"=>"ini"
)
);
echo json_encode($text);
?>