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

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

通常状况下,获取到一段json内容,直接json_decode($content, true)就转成array来用了,很方便。

可是,若是给你提供json内容的接口出了点问题,给的json不标准或是干脆有错误,那就要想办法来找出问题了。

先看看json_encode的manul

http://cn2.php.net/manual/en/...

失败时返回NULLhtml

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

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

一、获取错误码

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版本才有,若是版本低,就本身定义一个吧。函数

二、低版本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字符串想..net

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

根据utf8的编码范围,是能够剔除掉非法utf8字符的。

能够参见http://magp.ie/2011/01/06/rem...code

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

这里是把非法字符替换成?,根据须要本身改。htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值