摘要:看到一篇很好的文章,關于處理解析失敗的方法,寫的非常詳細,特此裝載過來。再說,沒有錯誤怎么會失敗呢如果是格式錯誤,再低版本的都會告訴你,所以碰上第一個可能性就往非法字符串想如何處理中的非法字符根據的編碼范圍,是可以剔除掉非法字符的。
看到一篇很好的文章,關于處理json_decode解析失敗的方法,寫的非常詳細,特此裝載過來。
一般情況下,獲取到一段json內容,直接json_decode($content, true)就轉成array來用了,很方便。
但是,如果給你提供json內容的接口出了點問題,給的json不標準或是干脆有錯誤,那就要想辦法來找出問題了。
先看看json_encode的manul
http://cn2.php.net/manual/en/...
失敗時返回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函數,見
http://cn2.php.net/manual/en/...
它會返回錯誤碼告訴我們是什么原因出錯了。
錯誤碼看不懂?可以用json_last_error_msg,見
http://cn2.php.net/manual/en/...
不過json_last_error_msg只在php >= 5.5.0版本才有,如果版本低,就自己定義一個吧。
但是,注意看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...
//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? $some_string = preg_replace("/[x00-x08x10x0Bx0Cx0E-x19x7F]". "|[x00-x7F][x80-xBF]+". "|([xC0xC1]|[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 json_decode失敗
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21837.html
摘要:介紹,它綁定來實現快速解析,是一個高速的解析器,它使用了大多數單一指令。介紹環境依賴帶有的處理器即,年發布的微體系結構的處理器和年發布的微體系結構的處理器,大多數都是支持的最近的編譯器例如,或或,我們假設。 介紹 simdjson_php(https://github.com/crazyxman/...,它綁定simdjson來實現快速解析,simdjson是一個高速的json解析器,...
摘要:我們的平臺上有虛擬商品和實體商品兩大分類,當時也考慮到了消息的讀取狀態。商家發送時間是否已讀。看前端代碼當前的所有代碼并不是最終的,目前只是階段性開發,后期在項目中逐步完善。 前段時間公司提了一個新的需求,在商品的詳情頁要實現站內買家和商品賣家實時通訊的功能以方便溝通促成交易,要開發此功能當時首先考慮到的就是swoole和workerman了,從網上大概了解了一下關于這兩款工具的闡述,...
摘要:我們的平臺上有虛擬商品和實體商品兩大分類,當時也考慮到了消息的讀取狀態。商家發送時間是否已讀。看前端代碼當前的所有代碼并不是最終的,目前只是階段性開發,后期在項目中逐步完善。 前段時間公司提了一個新的需求,在商品的詳情頁要實現站內買家和商品賣家實時通訊的功能以方便溝通促成交易,要開發此功能當時首先考慮到的就是swoole和workerman了,從網上大概了解了一下關于這兩款工具的闡述,...
摘要:我們的平臺上有虛擬商品和實體商品兩大分類,當時也考慮到了消息的讀取狀態。商家發送時間是否已讀。看前端代碼當前的所有代碼并不是最終的,目前只是階段性開發,后期在項目中逐步完善。 前段時間公司提了一個新的需求,在商品的詳情頁要實現站內買家和商品賣家實時通訊的功能以方便溝通促成交易,要開發此功能當時首先考慮到的就是swoole和workerman了,從網上大概了解了一下關于這兩款工具的闡述,...
摘要:我們的平臺上有虛擬商品和實體商品兩大分類,當時也考慮到了消息的讀取狀態。商家發送時間是否已讀。看前端代碼當前的所有代碼并不是最終的,目前只是階段性開發,后期在項目中逐步完善。 前段時間公司提了一個新的需求,在商品的詳情頁要實現站內買家和商品賣家實時通訊的功能以方便溝通促成交易,要開發此功能當時首先考慮到的就是swoole和workerman了,從網上大概了解了一下關于這兩款工具的闡述,...
閱讀 3593·2021-11-23 09:51
閱讀 2795·2021-11-23 09:51
閱讀 676·2021-10-11 10:59
閱讀 1672·2021-09-08 10:43
閱讀 3223·2021-09-08 09:36
閱讀 3289·2021-09-03 10:30
閱讀 3293·2021-08-21 14:08
閱讀 2195·2021-08-05 09:59