0

我怎样才能抛出错误消息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 == '') {...}

可能吗?

4

3 回答 3

3

您应该更喜欢使用property_exists () 而不是 isset()。

与 isset() 不同,property_exists() 会返回 TRUE,即使该属性的值为 NULL。

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)。

于 2013-08-10T15:48:28.847 回答
2

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

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) {  }
于 2013-08-10T16:57:47.760 回答
1

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

你可以,但没有简单if但使用isset

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

}

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

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

$obj = json_decode('{}');
if (!empty((array)$obj)) {
}
于 2013-08-10T15:46:59.877 回答