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


mysql5.6 解析JSON字符串

支持复杂的嵌套格式

废话不多说,先上代码。

CREATE FUNCTION `json_parse`(`jsondata` longtext,`keyname` text) RETURNS text CHARSET utf8
BEGIN
	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;
						le*e 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值。

Android数据格式解析对象JSON用法 WORD版 Android数据格式解析对象JSON用法 WORD版

本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将J*a对象转成json格式的字符串,可以将json字符串转换成J*a。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

Android数据格式解析对象JSON用法 WORD版 0 查看详情 Android数据格式解析对象JSON用法 WORD版

这个方法是先找到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 result
FROM DUAL

运行以后,就得到result的结果,就是tt。如果需要其他元素,就替换一下对应的key值和字段,就好了。

以上就是怎么使用mysql5.6解析JSON字符串的详细内容,更多请关注其它相关文章!


# JSON  # 无锡网站营销与推广招商  # 优化网站分享美食视频  # 就能  # 第一个  # 会有  # 也不  # 文档  # 就会  # 如何设置  # 的是  # 数据格式  # 镜像  # MySQL  # 蓄电池营销推广新思维  # 重庆专业网站优化设计  # 济南推广抖音seo优化  # 网站seo优化方案总结  # 东阳seo优化  # 博罗seo优化推广  # 甜品店推广营销文案策划  # 重庆seo兼职 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  鲨鱼剧场app金币获取方法  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  哈尔滨城市通昵称修改方法  抖音号升级企业号怎么改名字?升级企业号有哪些好处?  《sketchbook》选中部分图案移动方法  《小黑盒》删除历史浏览方法  WPS文字如何进行简繁转换  c++如何使用std::thread::join和detach_c++线程生命周期管理  荣耀Magic7拍照夜景噪点处理_荣耀Magic7相机优化  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  cad加载的线型看不见怎么办_cad线型不可见问题解决方法  金牛福袋获取攻略  J*aScript事件处理:优化键盘输入与表单提交的实践指南  Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法  CSS如何使用outline-offset与颜色组合突出元素边框  PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素  b站如何管理订阅_b站订阅标签分类管理  2025考研成绩查询时间入口分享  优化 React onClick 事件处理:函数引用与箭头函数的对比  Git命令与VS Code UI操作的对应关系解析  《我的恋爱逃生攻略》中文名字输入方法  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  京东快递包裹信息查询入口 京东快递官方查询平台入口  《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐  如何在mysql中比较InnoDB和MyISAM区别  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  Lar*el 中高效执行多列更新:单次查询实现  c++中的const关键字用法大全_c++ const正确使用指南  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  盲鳗善于分泌黏液猜猜主要用来做什么  冬季去哪个城市旅游更有可能观测到极光  J*aScript类型数组_TypedArray使用  Django模型动态关联检查:高效管理复杂关系  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接  多多买菜门店端app订单查看方法  J*a列表元素格式化输出教程  HTML中多图片上传与预览:解决ID冲突的专业指南  百度网盘如何设置上传限额  C#解析来自网络的XML流数据 实时错误处理与重试机制  Win10通知横幅停留时间修改 Win10自定义通知显示时长【技巧】  如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐  Google Cloud Functions 时区处理指南:理解与最佳实践  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】 

 2023-05-31

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.