最近遇到了一個問題,就是在使用 MySQL 讀取 JSON 字段時,發(fā)現(xiàn)返回的數(shù)據(jù)不完整,只能讀取到一部分,經(jīng)過一番搜索和嘗試,終于找到了解決方法,現(xiàn)在分享給大家。
首先看一下我的表結(jié)構(gòu):
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT '', `json_content` json DEFAULT NULL, PRIMARY KEY (`id`) );
其中,json_content
字段就是我存儲 JSON 數(shù)據(jù)的字段。
接下來,我們來看一下讀取 JSON 字段的代碼:
SELECT json_content->"$.key" as key_value FROM test;
上面的代碼可以讀取 JSON 數(shù)據(jù)中指定key
的值,但是在我的實(shí)際應(yīng)用中,卻發(fā)現(xiàn)了一個問題:有些key
的值無法正確讀取。
經(jīng)過分析,發(fā)現(xiàn)問題出在了 MySQL 的默認(rèn)行為上,當(dāng)讀取 JSON 字段時,會默認(rèn)將字段中出現(xiàn)的轉(zhuǎn)義字符還原成原本的字符,比如\n
會被還原成換行符,但是有些轉(zhuǎn)義字符卻不會被還原,比如\'
,這就導(dǎo)致了讀取到的 JSON 數(shù)據(jù)是不完整的。
為了解決這個問題,我們可以使用 MySQL 提供的函數(shù)json_unquote()
,它可以將 JSON 字符串中的引號去掉,并且會將轉(zhuǎn)義字符還原成原始字符,這樣就可以保證讀取到的 JSON 數(shù)據(jù)是完整的了。
修改后的代碼如下所示:
SELECT json_unquote(json_content->"$.key") as key_value FROM test;
這樣我們就可以正確讀取到 JSON 數(shù)據(jù)了。