如何使用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 == '') {...}
有可能吗?
答案 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)) {
}