色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

mysql正則查詢,PHP如何判斷字符串是否標(biāo)準(zhǔn)JSON

傅智翔2年前15瀏覽0評論
mysql正則查詢,PHP如何判斷字符串是否標(biāo)準(zhǔn)JSON?

引言

在MYSQL 5.6及以下沒有 JSON 這個字段類型的時候,我們還只能用字符串存儲數(shù)組,對象,這些結(jié)構(gòu)數(shù)據(jù);甚至有直接將序列化的對象存庫的,都是無奈之舉。

編程中也時不時對接口進行json_encode / json_decode。那么如果所得的字符串不是標(biāo)準(zhǔn)的格式,有什么辦法快速檢測嗎?

本文就來說一說。

學(xué)習(xí)時間

最快的辦法,還是使用PHP內(nèi)置的 json_decode 函數(shù),對于此函數(shù)的參數(shù)和返回值,我們需要認(rèn)真地分析。

該函數(shù)接受一個 JSON 編碼的字符串并且把它轉(zhuǎn)換為 PHP 變量。函數(shù)結(jié)構(gòu):

mixed json_decode( string $json[, bool $assoc = false[, int $depth = 512[, int $options = 0]]] )

除了第一個字符串類型的$json必填之外,其他都是選填。如果我們定制功能,需要后面的參數(shù)也指定。比如,解碼的字符串解析為關(guān)聯(lián)數(shù)組,那么就指定 $assoc = true。

考慮到兼容性的要求,$json 傳入的字符串,必須是 UTF-8 編碼格式。

我們試著編寫一個助手函數(shù),用于判斷字符串是否標(biāo)準(zhǔn)的json格式:

function isJson($string) { json_decode($string); return (json_last_error() == JSON_ERROR_NONE); }

這個方法使用了2個函數(shù),和1個常量。其中 json_decode 是對字符串解碼暫且不說。json_last_error 函數(shù),如果有返回值,則是 JSON 編碼解碼時最后發(fā)生的錯誤。

JSON_ERROR_NONE 是無錯誤,=0。該句判斷沒有錯誤則是標(biāo)準(zhǔn)格式,返回 true;否則返回 false。

深入學(xué)習(xí)

其實上面的代碼對于 json 加解碼過程中的錯誤判斷還是比較粗糙的。有一位小哥不嫌繁瑣,手動拼裝了詳細的錯誤處理函數(shù),非常實用。

使用上述函數(shù)進行測試:

$json = '[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]'; $output = json_validate($json); print_r($output);

輸出內(nèi)容如下:

這是正常的情況,json 格式完全正確。我們再測試一個不是規(guī)范格式的字符串。

$json = '{background-color:yellow;color:#000;padding:10px;width:650px;}'; $output = json_validate($json); print_r($output);

輸出錯誤信息:

Syntax error, malformed JSON.

萬能的正則

跟字符串打交道,正則表達式幾乎可以做一切你想要的結(jié)果。json 字符串也一樣,據(jù)文檔所說,使用正則表達式判斷JSON格式,穩(wěn)定有效,而且速度還很快。

下面這個正則表達式您拿小本本記好了,一模一樣地抄下來用就可以了。

return !preg_match('/[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]/', preg_replace('/"(\\.|[^"\\\\])*"/', '', $json_string));

寫在最后

如果考慮程序的可讀性,和可維護性,使用 json_decode 函數(shù)的判斷無疑更直觀,大家也更熟悉。然而正則表達式所體現(xiàn)出的高效也是不容小覷的。

Happy coding :_)

我是 @程序員小助手 ,持續(xù)分享編程知識,歡迎關(guān)注。