首页 > PHP > 优化原生json_decode函数

优化原生json_decode函数

PHP原生的json_decode函数非常坑,例如你传入一个空字符串,返回NULL;你传入一个非json字符串,返回NULL;你传入非UTF-8编码的json,返回NULL。各种错误满天飞的情况下,你却只能得到PHP的NULL,是不是心里很不爽?

还好,PHP给出了一系列的辅助方法来监控这些错误:

json_last_error — 返回最后发生的错误

然后是系列的错误代码常量:JSON_ERROR_NONE、JSON_ERROR_DEPTH、JSON_ERROR_STATE_MISMATCH、JSON_ERROR_CTRL_CHAR、JSON_ERROR_SYNTAX、JSON_ERROR_UTF8。

通过这些错误代码,我们能很清晰知道json字符串到底是哪里出了毛病,因此能够制定出解决这些毛病的方案。

已经封装为以下方法:

/**
 * json解析接口,优化json_decode对数组的解析
 * @param   string      $json_code json字符串
 * @return  mix         错误信息或者数组
 */
function _json_decode($json_code)
{
    $json_arr = json_decode($json_code ,true);
    switch (json_last_error()){
        case JSON_ERROR_NONE:
            $error = '';
        break;
        case JSON_ERROR_DEPTH:
            $error = ' - Maximum stack depth exceeded';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            $error = ' - Underflow or the modes mismatch';
        break;
        case JSON_ERROR_CTRL_CHAR:
            $error = ' - Unexpected control character found';
        break;
        case JSON_ERROR_SYNTAX:
            $error = ' - Syntax error, malformed JSON';
        break;
        case JSON_ERROR_UTF8:
            $error = ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
        default:
            $error = ' - Unknown error';
        break;
    }
    if($error)
    {
        return $error.':'.$json_code;
    }else{
        return $json_arr;
    }
}

给一个错误的json解析的demo:

//如果从网络api抓取失败,返回的response为错误信息,比如说请求超时
$response = '["a":"]';
//json_decode之后返回NULL,你打印之后仍然没有输出,所以你采纳的那个答案仍然也帮不到你
var_dump(json_decode($response, true));
//使用var_dump打印虽然可以看到NULL值,可是这并没有任何用处
var_dump(json_decode($response, true));
//但是你使用优化后的_json_decode就不一样了,如果返回值不是Array类型你就能捕获错误信息
$result = _json_decode($response);
if(!is_array($result))
{
	//请求超时, 一般都会有异常处理机制, 例如重新发起请求
	if($result == 'request timeout') {
		//发起请求
	}else{
		//如果没有异常处理机制,抛出异常给上一层处理
		throw new Exception($result);
	}
}else{
	//请求正常的情况下处理其他逻辑
	//print_r($result);
}

使用_json_decode的返回值如果是字符串,说明在解析json数据时遇到了错误,只要添加适当处理机制,可以大大提高代码的稳固性。

如果返回值是数组,这时便可以使用print_r打印出来。



教程地址:http://blog.zhengshuiguang.com/php/json_decode.html

欢迎转载!但请带上文章地址^^

标签:json_decode json解析 异常捕获

评论已关闭