JSONPath查询以获取节点名称?

d7v8vwbk  于 2023-02-26  发布在  其他
关注(0)|答案(7)|浏览(182)

考虑JSONPath的以下部分:

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

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

lsmepo6l

lsmepo6l1#

"试试这个"

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

pxiryf3j2#

在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] );

我用第二个参数True解码JSON字符串,强制结果为数组,然后调用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删除重复的键。

k7fdbhmy

k7fdbhmy3#

可以使用以下函数以数组格式打印所有键
打印r(数组键($数组));

nnvyjq4y

nnvyjq4y4#

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
希望对你有帮助。

twh00eeo

twh00eeo5#

是否可以获得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!
}
qxsslcnc

qxsslcnc6#

试试这个

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

6uxekuva7#

请检查下面的代码。.希望会工作

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

echo json_encode($text);
?>

相关问题