(轉)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

原文地址:
php json_decode失敗blog

相關文章
相關標籤/搜索