php json_decode解析失败及错误处理

php json_decode解析失败及错误处理一般情况下,获取到一段json内容,直接json_decode($content,true)就转成array来用了,很方便。但是,如果给你提供json内容的接口出了点问题,给的json不标准或是干脆有错误,那就要想办法来找出问题了。先看看json_encode的php官方文档源码:http://cn2.php.net/manual/en/…失败时返回NULL<?php//$json='{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5,”name”:”.

大家好,又见面了,我是你们的朋友全栈君。

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

失败时返回NULL

<?php

// $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…

<?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 );

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159254.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分布式锁的实现和应用场景_redis分布式锁释放锁

    分布式锁的实现和应用场景_redis分布式锁释放锁分布式锁为了解决分布式场景下全局加锁的问题。在单体项目中可以使用synchronize完成对于不同线程之间的资源争抢问题。但是在分布式场景下,synchronize只能对其中一个项目进行资源控制,进程之间的资源增强仍然无法解距。换言之,可以将分布式锁理解为对于整个分不是系统的synchronize。通常使用独立与线程之外的工具控制资源,如redis及框架redisson。1.传统单体架构业务流程synchronized(this){ /** 业务逻辑扣减库存 */}以上代码对于单体架构可

    2022年9月7日
    0
  • dede内容页调用图片集下所有图片方法!

    dede内容页调用图片集下所有图片方法!

    2021年9月22日
    39
  • freemarker错误九

    freemarker错误九

    2022年1月3日
    44
  • idea2019开发第一个java程序HelloWorld「建议收藏」

    idea2019开发第一个java程序HelloWorld「建议收藏」用idea2019开发第一个java程序:(马克-towin:idea破解不在本讲义范围之内)新手建议忽略此部分,先把eclipse用熟。技术是一样的。idea缺省配置是黑色的,很晃眼,可以(Files/settings/editor/colorscheme,然后右侧框中选择(Default(白色)或者Darcula(黑色)))底下都一样了。右击src/new/javaclass,名字叫…

    2022年5月24日
    37
  • 动态调用function

    动态调用function

    2021年8月10日
    61
  • c语言也能写植物大战僵尸吗_植物大战僵尸僵尸写的纸条

    c语言也能写植物大战僵尸吗_植物大战僵尸僵尸写的纸条不少同学都玩过《植物大战僵尸》,最近PopCap公司又带来了新版的消息,这次高兴的轮到Xbox的用户了,日前PopCap公司公布了《植物大战僵尸》XBLA版的截图,这个版本的《植物大战僵尸》引入了多人合作与对抗模式,看图就知道好玩多了又刺激多了。 详见游戏说明,游戏视频于是,我在非常强烈的好奇心和求知欲下,自己动手写了一个简易的双人

    2022年10月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号