回覆列表
-
1 # 程式設計師小助手
-
2 # 萬能擼Sir
直接用json_decode,反序列化字串,如何出錯就是非標準,不出錯就是標準。具體錯誤,json_last_error會返回,0表示沒問題,非0,則是有問題。
直接用json_decode,反序列化字串,如何出錯就是非標準,不出錯就是標準。具體錯誤,json_last_error會返回,0表示沒問題,非0,則是有問題。
引言
在MYSQL 5.6及以下沒有 JSON 這個欄位型別的時候,我們還只能用字串儲存陣列,物件,這些結構資料;甚至有直接將序列化的物件存庫的,都是無奈之舉。
程式設計中也時不時對介面進行json_encode / json_decode。那麼如果所得的字串不是標準的格式,有什麼辦法快速檢測嗎?
本文就來說一說。
學習時間最快的辦法,還是使用PHP內建的 json_decode 函式,對於此函式的引數和返回值,我們需要認真地分析。
該函式接受一個 JSON 編碼的字串並且把它轉換為 PHP 變數。函式結構:
mixed json_decode( string $json[, bool $assoc = false[, int $depth = 512[, int $options = 0]]] )
除了第一個字串型別的$json必填之外,其他都是選填。如果我們定製功能,需要後面的引數也指定。比如,解碼的字串解析為關聯陣列,那麼就指定 $assoc = true。
考慮到相容性的要求,$json 傳入的字串,必須是 UTF-8 編碼格式。
我們試著編寫一個助手函式,用於判斷字串是否標準的json格式:
function isJson($string) { json_decode($string); return (json_last_error() == JSON_ERROR_NONE); }
這個方法使用了2個函式,和1個常量。其中 json_decode 是對字串解碼暫且不說。json_last_error 函式,如果有返回值,則是 JSON 編碼解碼時最後發生的錯誤。
JSON_ERROR_NONE 是無錯誤,=0。該句判斷沒有錯誤則是標準格式,返回 true;否則返回 false。
深入學習其實上面的程式碼對於 json 加解碼過程中的錯誤判斷還是比較粗糙的。有一位小哥不嫌繁瑣,手動拼裝了詳細的錯誤處理函式,非常實用。
使用上述函式進行測試:
$json = "[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]"; $output = json_validate($json); print_r($output);
輸出內容如下:
這是正常的情況,json 格式完全正確。我們再測試一個不是規範格式的字串。
$json = "{background-color:yellow;color:#000;padding:10px;width:650px;}"; $output = json_validate($json); print_r($output);
輸出錯誤資訊:
Syntax error, malformed JSON.
萬能的正則跟字串打交道,正則表示式幾乎可以做一切你想要的結果。json 字串也一樣,據文件所說,使用正則表示式判斷JSON格式,穩定有效,而且速度還很快。
下面這個正則表示式您拿小本本記好了,一模一樣地抄下來用就可以了。
return !preg_match("/[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]/", preg_replace("/"(\\.|[^"\\\\])*"/", "", $json_string));
寫在最後如果考慮程式的可讀性,和可維護性,使用 json_decode 函式的判斷無疑更直觀,大家也更熟悉。然而正則表示式所體現出的高效也是不容小覷的。
Happy coding :_)