如何在PHP中检查JSON对象是否为空?

时间:2009-09-07 13:28:11

标签: php json

我正在使用PHP读取JSON数据,并且该数据包含空对象(如{})。所以问题是,我必须以不同的方式处理对象为空的情况,但我找不到足够好的方法来进行检查。 empty(get_object_vars(object))看起来太可怕而且非常低效。有没有好办法进行检查?

5 个答案:

答案 0 :(得分:25)

您可以将其转换为数组(遗憾的是,您无法在调用empty()时执行此操作:

$x = (array)$obj;
if (empty($x))
    ...

或转换为数组count()

if (count((array)$obj))
    ...

答案 1 :(得分:23)

您要反序列化多少个对象?除非empty(get_object_vars($object))或者数组投射被证明是一个主要的减速/瓶颈,否则我不会担心--Greg的解决方案很好。

我建议在解码JSON数据时使用$associative标志,但是:

json_decode($data, true)

这将JSON对象解码为普通的旧PHP数组,而不是stdClass个对象。然后,您可以使用empty()检查空对象,并创建用户定义类的对象,而不是使用stdClass,这从长远来看可能是一个好主意。

答案 2 :(得分:3)

尝试不使用empty(),即:

get_object_vars($obj) ? TRUE : FALSE;

PHP docs,我们可以阅读说明:

  

在无法访问的对象属性上使用empty()时,如果声明了__isset()重载方法,则会调用它。

这意味着当对具有empty()方法的对象使用__get()时,它将始终返回True。

答案 3 :(得分:0)

我必须判断对象是否为空,但我还必须忽略私有属性和受保护属性,因此我使用了这个小函数来完成此任务。

function empty_obj(&$object, $ignore_private = true, $ignore_protected = true) {
  $obj_name = get_class($object);
  $obj = (array)$object;

  foreach(array_keys($obj) as $prop) {
    $is_private = $is_protected = false;

    $prop = preg_replace("/[^\w*]/", '', $prop);
    $prop_name = str_replace(array($obj_name, '*'), '', $prop);

    if(preg_match("~^$obj_name$prop_name$~", $prop))
      $is_private = true;
    if(preg_match("~^\*$prop_name$~", $prop))
      $is_protected = true;

    if(!$is_private || !$is_protected || ($is_private && !$ignore_private) || ($is_protected && !$ignore_protected))
      return;
  }
  return true;
}

答案 4 :(得分:0)

我不确定这是否比投射到阵列更有效或更有效但我想更多。您可以开始循环对象,一旦找到答案并停止循环,就会立即开始循环。

function is_obj_empty($obj){
   if( is_null($obj) ){
      return true;
   }
   foreach( $obj as $key => $val ){
      return false;
   }
   return true;
}