如何使用JSONPath查询获取节点名称?

11

考虑以下JSONPath代码:

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

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


1
为什么不使用JavaScript解释器来解决这个问题? - Vitalii
7个回答

5

试试这个

$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
)

4
在 PHP >= 5.4 中,您可以通过一行代码获取您的密钥:
$nodeNames = array_keys( json_decode( $jsonString, True )['result'][0] );

3v4l.org演示

在低版本(PHP >= 5.2.16)中,您需要将上面的代码分成两行:

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

我使用第二个参数为True的方式解码JSON字符串,以强制结果为数组,然后调用 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 ) ) );
}

或者,使用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删除重复的键。

1

JSON Path是否每次都遵循这种结构?即结果=>所有具有相同节点的数组。

如果是这样,那么以下内容就可以正常工作:

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

希望它能以任何方式帮助到您。


1
你可以使用以下函数以数组格式打印所有键:

print_r(array_keys($array));


0

是否有可能获取所有节点名称的列表?

$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!
}

-1

试试这个

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

1
OP 正在尝试获取属性名称,即 typestreetcity - Jeremy J Starcher
然后尝试:$a = array('type', 'street', 'city'); - Antoine Pinsard

-2
请检查下面的代码..希望能够正常工作。
<?php
$text[]=array(
            result=>array(
                "type"=>"Residence",
                "street"=>"pizza",
                "city"=>"ini"
            ),
            array(
                "type"=>"Residence",
                "street"=>"pizza",
                "city"=>"ini"
            )
        );

echo json_encode($text);
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接