• 当 json_decode 解析为 null 的时候怎么处理
  • 当 json 中出现非法 utf8 时怎么处理

失败时返回NULL

当返回 null 的时候,可以用json_last_error()根据返回码来判断

如果 php 版本过低的话将会出现错误码反馈不全的问题,返回值是JSON_ERROR_NONE (0) 这是示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 //  $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中的非法utf8字符

如果出现 JSON_ERROR_SYNTAX 这个错误码的时候,常见的要么是其中的双引号单引号问题,要么是 出现了 /r/n之类的结尾问题,还有一种比较烦的情况就是错误的 utf8编码

解决问题:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//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 );

原文 utf8代码