首頁  >  文章  >  後端開發  >  php json_decode 解析失敗怎麼辦

php json_decode 解析失敗怎麼辦

藏色散人
藏色散人原創
2021-09-10 09:38:374455瀏覽

php json_decode解析失敗的解決方法:1、透過json_last_error等函數取得錯誤碼;2、根據utf8的編碼範圍剔除掉非法utf8字元。

php json_decode 解析失敗怎麼辦

本文操作環境:windows7系統、PHP7.1版,DELL G3電腦

php json_decode 解析失敗怎麼辦?

php json_decode解析失敗及錯誤處理

#一般情況下,取得到一段json內容,直接json_decode($content, true)就轉成array來用了,很方便。
但是,如果提供你json內容的介面出了點問題,給的json不標準或是乾脆有錯誤,那就要想辦法來找出問題了。
先看看json_encode的manul
https://www.php.net/manual/en/function.json-last-error.php

 失敗時回傳NULL

 //  $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函數,請參考
https://www.php.net/manual/en/function.json -last-error.php

它會回傳錯誤碼告訴我們是什麼原因出錯了。
錯誤碼看不懂?可用json_last_error_msg,見
https://www.php.net/manual/en/function.json-last-error-msg.php

不過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字元的。
可以參考https://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-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 );

這裡是把非法字元替換成? ,根據需要自己改。

推薦學習:《PHP影片教學

以上是php json_decode 解析失敗怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn