回覆列表
  • 1 # 程式設計師小助手

    引言

    在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 :_)

  • 2 # 萬能擼Sir

    直接用json_decode,反序列化字串,如何出錯就是非標準,不出錯就是標準。具體錯誤,json_last_error會返回,0表示沒問題,非0,則是有問題。

  • 中秋節和大豐收的關聯?
  • 要當兵當武警,新兵訓練,和武警訓練,具體要,學什麼?