mysql5.6?解析JSON字符串方式(支持復雜的嵌套格式)「建議收藏」這篇文章主要介紹了mysql5.6?解析JSON字符串方式(支持復雜的嵌套格式),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
廢話不多說,先上代碼。
CREATE FUNCTION `json_parse`(`jsondata` longtext,`keyname` text) RETURNS text CHARSET utf8BEGINDECLARE delim VARCHAR(128);DECLAREresult longtext;DECLARE startpos INTEGER;DECLARE endpos INTEGER;DECLARE endpos1 INTEGER; DECLARE findpos INTEGER;DECLARE leftbrace INTEGER;DECLARE tmp longtext; DECLARE tmp2 longtext;DECLARE Flag INTEGER; SET delim = CONCAT('"', keyname, '": "');SET startpos = locate(delim,jsondata); IF startpos > 0 THENSET findpos = startpos+length(delim);SET leftbrace = 1;SET endpos = 0;SET Flag =1;get_token_loop: repeat IF substr(jsondata,findpos,2)='\\"' THENSET findpos = findpos + 2;iterate get_token_loop;ELSEIF substr(jsondata,findpos,2)='\\\\' THENSET findpos = findpos + 2;iterate get_token_loop;ELSEIF substr(jsondata,findpos,1)='"' AND Flag = 1 THEN SET endpos = findpos;SET findpos = LENGTH(jsondata)+1;leave get_token_loop;END IF;SET findpos = findpos + 1;UNTIL findpos > LENGTH(jsondata) END repeat;IF endpos > 0 THENSELECT substr(jsondata,startpos+length(delim)#取出value值的起始位置,endpos#取出value值的結束位置-(startpos+length(delim))#減去value值的起始位置,得到value值字符長度) INTO resultFROM DUAL;SET result= replace(result,'\\"','"');SET result= replace(result,'\\\\','\\');ELSE SET result=null;END IF;/*SELECT substr(jsondata,locate(delim,jsondata)+length(delim)#取出value值的起始位置,locate('"',jsondata,locate(delim,jsondata)+length(delim))#取出value值的結束位置-(locate(delim,jsondata)+length(delim))#減去value值的起始位置,得到value值字符長度) INTO resultFROM DUAL;*/ELSESET delim = CONCAT('"', keyname, '": {');SET startpos = locate(delim,jsondata);IF startpos > 0 THENSET findpos = startpos+length(delim);SET leftbrace = 0;SET endpos = 0;SET Flag =0;get_token_loop: repeat IF substr(jsondata,findpos,2)='{"' THENSET leftbrace = leftbrace + 1;SET findpos = findpos + 2;iterate get_token_loop;ELSEIF substr(jsondata,findpos,2)='\\"' THENSET findpos = findpos + 2;iterate get_token_loop;ELSEIF substr(jsondata,findpos,3)=': "' THENSET Flag = 1;SET findpos = findpos + 3;iterate get_token_loop;ELSEIF substr(jsondata,findpos,1)='"' THENSET Flag = 0;ELSEIF substr(jsondata,findpos,1)='}' AND Flag = 0 THENIF leftbrace > 0 THENSET leftbrace = leftbrace - 1;ELSE SET endpos = findpos;SET findpos = LENGTH(jsondata)+1;END IF;END IF;SET findpos = findpos + 1;UNTIL findpos > LENGTH(jsondata) END repeat;IF endpos > 0 THENSELECT substr(jsondata,startpos+length(delim)#取出value值的起始位置,endpos#取出value值的結束位置-(startpos+length(delim))#減去value值的起始位置,得到value值字符長度) INTO resultFROM DUAL;SET result=CONCAT("{",result, '}');ELSE SET result=null;END IF;ELSE SET delim = CONCAT('"', keyname, '": [');SET startpos = locate(delim,jsondata);IF startpos > 0 THENSET findpos = startpos+length(delim);SET leftbrace = 0;SET endpos = 0; SET tmp = substring_index(jsondata,delim,-1);SET tmp2 = substring_index(tmp,']',1); IF locate('[',tmp2) =0 THENSET endpos = locate(']',tmp);SET endpos = endpos+findpos-1; ELSEget_token_loop: repeat IF substr(jsondata,findpos,2)='\\"' THENSET findpos = findpos + 2;iterate get_token_loop;ELSEIF substr(jsondata,findpos,3)=': "' THENSET Flag = 1;SET findpos = findpos + 3;iterate get_token_loop;ELSEIF substr(jsondata,findpos,1)='[' AND Flag = 0 THENSET leftbrace = leftbrace + 1;SET findpos = findpos + 1;iterate get_token_loop;ELSEIF substr(jsondata,findpos,1)='"' THENSET Flag = 0;ELSEIF substr(jsondata,findpos,1)=']' AND Flag = 0 THENIF leftbrace > 0 THENSET leftbrace = leftbrace - 1;ELSE SET endpos = findpos;SET findpos = LENGTH(jsondata)+1;END IF;END IF;SET findpos = findpos + 1;UNTIL findpos > LENGTH(jsondata) END repeat;END IF;IF endpos > 0 THENSELECT substr(jsondata,startpos+length(delim)#取出value值的起始位置,endpos#取出value值的結束位置-(locate(delim,jsondata)+length(delim))#減去value值的起始位置,得到value值字符長度) INTO resultFROM DUAL;SET result=CONCAT("[",result, ']');ELSE SET result=null;END IF;ELSE SET delim = CONCAT('"', keyname, '": ');SET startpos = locate(delim,jsondata);IF startpos > 0 THENSET endpos = locate(',',jsondata,startpos+length(delim));SET endpos1 = locate('}',jsondata,startpos+length(delim));IF endpos>0 OR endpos1>0 THENIF endpos1>0 AND endpos1 < endpos OR endpos =0 THENSET endpos = endpos1;END IF;SELECT substr(jsondata,startpos+length(delim)#取出value值的起始位置,endpos#取出value值的結束位置-(locate(delim,jsondata)+length(delim))#減去value值的起始位置,得到value值字符長度) INTO resultFROM DUAL;IF STRCMP(result,'null')=0 THENSET result=null;END IF;ELSE SET result=null;END IF;ELSE SET result=null;END IF;END IF;END IF;END IF;if result='' and RIGHT(keyname,2)='Id' thenSET result=null;end if;RETURN result;END
希望我今天分享的這篇文章可以幫到您。
jsondata需要嚴格的json格式(注意逗號和分號以及雙引號之間的空格)
SET jsondata='{"CurrentPage": 1, "data": [{"config": "123"}, {"config": "456"}], "PageSize": 10}'SELECT json_parse(jsondata, 'CurrentPage') INTO CurrentPage;SELECT json_parse(jsondata, 'data') INTO data;
這邊如果想獲取config的內容,可以這樣處理
SET count = (LENGTH(data)-LENGTH(REPLACE(data,'},','')))/2+1; SET i = 0; WHILE i < count DO SET SetObject = SUBSTRING_INDEX(SUBSTRING_INDEX(data,'},',i+1),'},',-1); IF LENGTH(SetObject)>0 THEN SELECT json_parse(SetObject, 'config') INTO config; END IF; SET i = i + 1; END WHILE;
不足之處,jsondata數據多的情況下,會有效率問題。
之前在公司發現在線的查詢平臺是MySQL5.6,不能用JSON_EXTRACT,也不能用存儲過程,所以只能自己編了一個簡單的小查詢,幾條數據還是能查的,如果數據量大的話,估計耗的資源就會比較多。
是想在'{“platform”:”Android”,”source”:”tt”,”details”:null}’這一串東西里面找到source這個key對應的value值。
這個方法是先找到source”:”這個字符串的起始位置和長度,這樣就能夠找到value值的起始位置;再找到這個字符串以后第一個”出現的位置,就能得到value值的結束位置。
再利用substr函數,就可以取出對應的位置。
SELECT '{"platform":"Android","source":"tt","details":null}' as 'sample',substr( '{"platform":"Android","source":"tt","details":null}' ,locate('source":"','{"platform":"Android","source":"tt","details":null}') +length('source":"')#取出value值的起始位置 ,locate( '"' ,'{"platform":"Android","source":"tt","details":null}' ,locate('source":"','{"platform":"Android","source":"tt","details":null}') +length('source":"') )#取出value值的結束位置 -( locate('source":"','{"platform":"Android","source":"tt","details":null}') +length('source":"') )#減去value值的起始位置,得到value值字符長度 ) as resultFROM DUAL
運行以后,就得到result的結果,就是tt。如果需要其他元素,就替換一下對應的key值和字段,就好了。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持我們。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
農村信用社貸款要求:1、貸款人年齡在18-65周歲。有按期還本付息的能力。原應付貸款利息和到期貸款已基本清償;沒有清償的,已經作了貸款人認可的償還計劃。.2、農村在貸款社已開立基本賬戶或一般存款賬戶,并在該賬戶內保留有一定數額的支付保證金;自愿接受貸款社的信貸及結算的監督檢查,能夠保證定期向貸款社報送經營計劃和相關業務、財務報表。3、申請保證、抵押貸款的,必須具有符合規定的貸款保證人貸款抵押物或質...
(資料圖)關于哈士奇多少錢一只的知識大家了解嗎?以下就是小編整理的關于哈士奇多少錢一只的介紹,希望可以給到大家一些參考,一起來了解下吧!哈士奇幼犬在1000-1500元,寵物店比家養的貴一倍左右。純種哈士奇價格在4000-9000元,非純種哈士奇價格一般只有幾百元。寵物級的哈士奇價格在1000-9000元,而比賽級的哈士奇在9000元左右,在購買哈士奇幼崽時,盡量購買純種幼崽。...
國企高管的薪酬規定有哪些?新規定的內容涉及國有企業負責人的薪酬結構、薪酬體系、基本年薪、績效年薪、補充保險、崗位消費標準模式和監督體系。重點是奠定我國國有企業高管薪酬體系的總體框架和薪酬水平的大致范圍。鑒于金融業的特殊性,本規定頒布后,相關主管部門將針對金融和非金融企業等發布具體實施細則。各地也將參照本規定出臺相關地方性法規,全面規范國有企業負責人的薪酬管理。與員工平均工資掛鉤為確保條例的實施和有...