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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分析ip地址,子网掩码,网关,dns之间的区别和联系(ip地址 子网掩码 网关的关系)

    转自:[https://www.cnblogs.com/JuneWang/p/3917697.html]IP地址,子网掩码、默认网关,DNS服务器是什么意思?(一)问题解析问:IP地址,子网掩码,默认网关,DNS服务器,有什么区别呀?我知道没有IP地址就不能上网,我也知道没设DNS就不能上外网,可它们都有什么功能,有什么区别呢?还有真奇怪,我的计算机没设DNS,竟然能上QQ,却不能…

    2022年4月13日
    61
  • 数据库系统课程设计(高校成绩管理数据库系统的设计与实现)

    数据库系统课程设计(高校成绩管理数据库系统的设计与实现)数据库课程设计

    2022年7月16日
    21
  • PHP操作mysql数据库:[2]查询数据听语音

    PHP操作mysql数据库:[2]查询数据听语音

    2022年2月23日
    56
  • 进程和线程的主要区别(总结)

    进程和线程的主要区别(总结)根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调…

    2022年7月25日
    14
  • android脚本工具,安卓脚本编程软件[通俗易懂]

    android脚本工具,安卓脚本编程软件[通俗易懂]脚本编程助手是一款实用的脚本编程软件,对脚本程序感兴趣的朋友可以试试,内置多种辅助和工具,支持基础操作类、多功能操作类,基础辅助类和http类等等,为你写好更经典的脚本程序提供强大支持,有需要的朋友欢迎体验。软件相关脚本(Script)是一种批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。简介脚本简单…

    2022年5月23日
    38
  • 电容论坛(电感电容电压公式)

    玉山YGR智能电容以客为尊智能电容器模块是新一代无功补偿模块化装置,结合绿色智能电网的精神应用于绿色电网。产品以微电子技术为基础,集成了自动测控、无功优化、过零切换、多重保护、网络通信、大屏幕显示等技术,实现了低压无功补偿的全部功能,并改变不同的组合构造不同的补偿方案。它是一种智能化、模块化、标准化、集约化的无功补偿装置。 投切电容器组大约20-30毫秒内就完成一个全部动作,这种…

    2022年4月15日
    39

发表回复

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

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