如何使用json_decode抛出错误消息?

时间:2013-08-10 15:42:23

标签: php json

如何使用json_decode抛出错误消息?

例如,

$error = array(
    "key_name" => "Keyname - empty!",
    "pub_name" => "Pubname - empty!",
    "path" => "path - empty!"
);

$json = json_encode($error);
$object = json_decode($json);
print_r($object->keyname);

我明白了,

  

注意:未定义的属性:第32行的C:....中的stdClass :: $ key_namex

keyname实际上不存在,所以我想知道我是否可以使用if condition检查它,

if(!$object->keyname) { .... }

有可能吗?

有时候我没有错误内容,

$error = array(
);

$json = json_encode($error);
$object = json_decode($json);
print_r($object->key_name);

所以我想在继续执行下面的代码之前抛出错误,

if($object == '') {...}

有可能吗?

3 个答案:

答案 0 :(得分:3)

您应该优先使用property_exists()而不是isset()。

与isset()相反,即使属性值为NULL,property_exists()也返回TRUE。

if( property_exists($object, 'keyname') ){ 
   throw new Exception( 'Object key does not exist.' ); //I prefer this method
   //or
   trigger_error( 'Object key does not exist.', E_USER_ERROR );
}

顺便提一下,相同的模式应该与数组一起使用(出于同样的原因,array_key_exists优于isset)。

答案 1 :(得分:2)

你应该能够像这样抛出并捕获json decode错误。您也可以扩展它以处理编码。

class Json {

   public static function decode($jsonString) {  
       if ((string)$jsonString !== $jsonString) {  // faster !is_string check
          throw new Exception('input should be a string');
       }

       $decodedString = json_decode($jsonString)

       if ((unset)$decodedString === $decodedString) { // faster is_null check, why NULL check because json_decode return NULL with failure. 
           $errorArray = error_get_last(); // fetch last error this should be the error of the json decode or it could be a date timezone error if you didn't set it correctly   

           throw new Exception($errorArray['message']); 
       }
       return $decodedString;
   }
}



try {
   Json::decode("ERROR");
} catch (Exception $e) {  }

答案 2 :(得分:1)

  

keyname实际上不存在,所以我想知道我是否可以检查它   if条件,

你可以,但是使用if但是使用isset

if (isset($object->keyname)) { 

}

就像你对任何变量/数组偏移一样。

至于检查对象是否有任何属性,要么使用json_decode的第二个参数(要有关联数组),要么将其强制转换为数组并检查它是否为空:

$obj = json_decode('{}');
if (!empty((array)$obj)) {
}