温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php json之decode 解析失败的示例分析

发布时间:2021-09-10 10:08:04 来源:亿速云 阅读:167 作者:柒染 栏目:编程语言

这期内容当中小编将会给大家带来有关php json之decode 解析失败的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

php json_decode解析失败的解决办法:1、通过json_last_error等函数获取错误码;2、根据utf8的编码范围剔除掉非法utf8字符。

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

php json_decode 解析失败怎么办?

php json_decode解析失败及错误处理

一般情况下,获取到一段json内容,直接json_decode($content, true)就转成array来用了,很方便。
但是,如果给你提供json内容的接口出了点问题,给的json不标准或是干脆有错误,那就要想办法来找出问题了。
先看看json_encode的manul
https://www.php.net/manual/en/function.json-last-error.php

失败时返回NULL

 //  $json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":"Corwien"}'; 
 $json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":}';  //错误的json格式
 $result = json_decode($json, true);
  if(!$result)
  {
        //error handle ,错误处理
        $ret = json_last_error();
        print_r($ret);   //打印为: 4,查错误信息表,可知是语法错误
        
  }   

json_last_error错误msg对照表:
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

我们如何知道错在哪里了呢?

1、获取错误码

php有一个json_last_error函数,见
https://www.php.net/manual/en/function.json-last-error.php

它会返回错误码告诉我们是什么原因出错了。
错误码看不懂?可以用json_last_error_msg,见
https://www.php.net/manual/en/function.json-last-error-msg.php

不过json_last_error_msg只在php >= 5.5.0版本才有,如果版本低,就自己定义一个吧。

2、低版本php json错误码不全

但是,注意看manual就会发现,json_last_error定义的很多错误码都是在高版本里才有的,低版本的php就歇菜了。例如JSON_ERROR_UTF8这个错误码明白地告诉我们json字符串中有非法utf8字符,但是只在Php >= 5.3.3中才有。而很悲剧的是,我的php就是5.3.2....

所以,如果你的json_last_error返回的是JSON_ERROR_NONE(0) ,并不是说没有错误,而只是这个错误在你的低版本php中没有定义。再说,没有错误怎么会失败呢....

如果是json格式错误,再低版本的php都会告诉你JSON_ERROR_SYNTAX,所以碰上JSON_ERROR_NONE第一个可能性就往非法utf8字符串想.

3、如何处理json中的非法utf8字符

根据utf8的编码范围,是可以剔除掉非法utf8字符的。
可以参见https://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
 '|[\x00-\x7F][\x80-\xBF]+'.
 '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
 '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
 '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
 '?', $some_string );
 
//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
 '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string );

这里是把非法字符替换成?,根据需要自己改。

上述就是小编为大家分享的php json之decode 解析失败的示例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI