资讯专栏INFORMATION COLUMN

(转)php json_decode解析失败及错误处理

KaltZK / 1533人阅读

摘要:看到一篇很好的文章,关于处理解析失败的方法,写的非常详细,特此装载过来。再说,没有错误怎么会失败呢如果是格式错误,再低版本的都会告诉你,所以碰上第一个可能性就往非法字符串想如何处理中的非法字符根据的编码范围,是可以剔除掉非法字符的。

看到一篇很好的文章,关于处理json_decode解析失败的方法,写的非常详细,特此装载过来。

一般情况下,获取到一段json内容,直接json_decode($content, true)就转成array来用了,很方便。
但是,如果给你提供json内容的接口出了点问题,给的json不标准或是干脆有错误,那就要想办法来找出问题了。
先看看json_encode的manul
http://cn2.php.net/manual/en/...
失败时返回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函数,见
http://cn2.php.net/manual/en/...
它会返回错误码告诉我们是什么原因出错了。
错误码看不懂?可以用json_last_error_msg,见
http://cn2.php.net/manual/en/...
不过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字符的。
可以参见http://magp.ie/2011/01/06/rem...

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace("/[x00-x08x10x0Bx0Cx0E-x19x7F]".
 "|[x00-x7F][x80-xBF]+".
 "|([xC0xC1]|[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失败

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21837.html

相关文章

  • simdjson_php 高速解析json

    摘要:介绍,它绑定来实现快速解析,是一个高速的解析器,它使用了大多数单一指令。介绍环境依赖带有的处理器即,年发布的微体系结构的处理器和年发布的微体系结构的处理器,大多数都是支持的最近的编译器例如,或或,我们假设。 介绍 simdjson_php(https://github.com/crazyxman/...,它绑定simdjson来实现快速解析,simdjson是一个高速的json解析器,...

    shadajin 评论0 收藏0
  • 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    摘要:我们的平台上有虚拟商品和实体商品两大分类,当时也考虑到了消息的读取状态。商家发送时间是否已读。看前端代码当前的所有代码并不是最终的,目前只是阶段性开发,后期在项目中逐步完善。 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款工具的阐述,...

    ZweiZhao 评论0 收藏0
  • 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    摘要:我们的平台上有虚拟商品和实体商品两大分类,当时也考虑到了消息的读取状态。商家发送时间是否已读。看前端代码当前的所有代码并不是最终的,目前只是阶段性开发,后期在项目中逐步完善。 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款工具的阐述,...

    CloudDeveloper 评论0 收藏0
  • 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    摘要:我们的平台上有虚拟商品和实体商品两大分类,当时也考虑到了消息的读取状态。商家发送时间是否已读。看前端代码当前的所有代码并不是最终的,目前只是阶段性开发,后期在项目中逐步完善。 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款工具的阐述,...

    姘存按 评论0 收藏0
  • 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    摘要:我们的平台上有虚拟商品和实体商品两大分类,当时也考虑到了消息的读取状态。商家发送时间是否已读。看前端代码当前的所有代码并不是最终的,目前只是阶段性开发,后期在项目中逐步完善。 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款工具的阐述,...

    Baoyuan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<