【问题标题】:JSONPath Query to get Node-names?JSONPath 查询以获取节点名称?
【发布时间】:2012-05-15 09:38:39
【问题描述】:

考虑以下 JSONPath:

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

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

【问题讨论】:

  • 为什么不使用 Javascript 解释器来解决这个问题?

标签: php json jsonpath


【解决方案1】:

试试这个

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

【讨论】:

  • OP 正在尝试获取属性名称,typestreetcity
  • 那就试试:$a = array('type', 'street', 'city');
【解决方案2】:

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

print_r(array_keys($array));

【讨论】:

    【解决方案3】:

    试试这个

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

      eval.in demo

      在较低版本(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 ) ) );
      }
      

      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 删除重复键。


      【讨论】:

        【解决方案5】:

        JSON 路径肯定每次都会遵循该结构吗?如 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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            请检查下面的代码..希望会起作用

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-06-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-19
              • 1970-01-01
              • 2012-03-06
              相关资源
              最近更新 更多