11

考虑以下 JSONPath:

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

是否可以获得所有节点名称的列表?
例如,我想要一个列表,例如:类型、街道、城市。

4

7 回答 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
)
于 2016-02-18T14:22:14.670 回答
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删除重复键。


于 2016-02-19T01:37:26.673 回答
1

您可以使用以下函数以数组格式打印所有键

print_r(array_keys($array));

于 2016-02-17T06:29:47.727 回答
1

JSON 路径每次都肯定会遵循该结构吗?与 Result => Arrays 一样,它们都具有相同的节点。

如果是这样,那么以下将起作用:

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

希望它对任何一种方式都有帮助。

于 2016-02-19T11:42:55.410 回答
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!
}
于 2016-02-20T09:29:08.447 回答
-1

尝试这个

$result[0].type , $result[0].street, $result[0].city
于 2012-09-18T07:26:50.913 回答
-2

请检查下面的代码..希望会奏效

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

echo json_encode($text);
?>
于 2016-02-20T11:14:07.353 回答