您好,欢迎访问一九零五行业门户网

怎么使用mysql5.6解析JSON字符串

mysql5.6 解析json字符串支持复杂的嵌套格式废话不多说,先上代码。
create function `json_parse`(`jsondata` longtext,`keyname` text) returns text charset utf8begin declare delim varchar(128); declare result 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 then set findpos = startpos+length(delim); set leftbrace = 1; set endpos = 0; set flag =1; get_token_loop: repeat if substr(jsondata,findpos,2)='\\"' then set findpos = findpos + 2; iterate get_token_loop; elseif substr(jsondata,findpos,2)='\\\\' then set 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 then select substr( jsondata ,startpos +length(delim)#取出value值的起始位置 ,endpos#取出value值的结束位置 -( startpos +length(delim) )#减去value值的起始位置,得到value值字符长度 ) into result from 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 result from dual; */ else set delim = concat('"', keyname, '": {'); set startpos = locate(delim,jsondata); if startpos > 0 then set findpos = startpos+length(delim); set leftbrace = 0; set endpos = 0; set flag =0; get_token_loop: repeat if substr(jsondata,findpos,2)='{"' then set leftbrace = leftbrace + 1; set findpos = findpos + 2; iterate get_token_loop; elseif substr(jsondata,findpos,2)='\\"' then set findpos = findpos + 2; iterate get_token_loop; elseif substr(jsondata,findpos,3)=': "' then set flag = 1; set findpos = findpos + 3; iterate get_token_loop; elseif substr(jsondata,findpos,1)='"' then set flag = 0; elseif substr(jsondata,findpos,1)='}' and flag = 0 then if leftbrace > 0 then set 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 then select substr( jsondata ,startpos +length(delim)#取出value值的起始位置 ,endpos#取出value值的结束位置 -( startpos +length(delim) )#减去value值的起始位置,得到value值字符长度 ) into result from dual; set result=concat("{",result, '}'); else set result=null; end if; else set delim = concat('"', keyname, '": ['); set startpos = locate(delim,jsondata); if startpos > 0 then set 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 then set endpos = locate(']',tmp); set endpos = endpos+findpos-1; else get_token_loop: repeat if substr(jsondata,findpos,2)='\\"' then set findpos = findpos + 2; iterate get_token_loop; elseif substr(jsondata,findpos,3)=': "' then set flag = 1; set findpos = findpos + 3; iterate get_token_loop; elseif substr(jsondata,findpos,1)='[' and flag = 0 then set leftbrace = leftbrace + 1; set findpos = findpos + 1; iterate get_token_loop; elseif substr(jsondata,findpos,1)='"' then set flag = 0; elseif substr(jsondata,findpos,1)=']' and flag = 0 then if leftbrace > 0 then set 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 then select substr( jsondata ,startpos +length(delim)#取出value值的起始位置 ,endpos#取出value值的结束位置 -( locate(delim,jsondata) +length(delim) )#减去value值的起始位置,得到value值字符长度 ) into result from dual; set result=concat("[",result, ']'); else set result=null; end if; else set delim = concat('"', keyname, '": '); set startpos = locate(delim,jsondata); if startpos > 0 then set endpos = locate(',',jsondata,startpos+length(delim)); set endpos1 = locate('}',jsondata,startpos+length(delim)); if endpos>0 or endpos1>0 then if endpos1>0 and endpos1 < endpos or endpos =0 then set endpos = endpos1; end if; select substr( jsondata ,startpos +length(delim)#取出value值的起始位置 ,endpos#取出value值的结束位置 -( locate(delim,jsondata) +length(delim) )#减去value值的起始位置,得到value值字符长度 ) into result from dual; if strcmp(result,'null')=0 then set 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' then set 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方法之前在公司发现在线的查询平台是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值和字段,就好了。
以上就是怎么使用mysql5.6解析json字符串的详细内容。
其它类似信息

推荐信息