JSONPath查询获取节点名称?

时间:2012-05-06 17:24:44

标签: php json jsonpath

考虑以下JSONPath:

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

是否可以获取所有节点名称的列表?
例如,我想要一个列表,如:type,street,city。

8 个答案:

答案 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);
?>