mysql5.7Json数组解析
2017-08-11 13:43
148 查看
个人博客地址 www.tmbcode.com
一、目标需求
mysql5.7支持json极大的方便了我们,但是其中json数组解析一直很麻烦,之前都是先取json数组的长度,然后遍历逐个解析,后来看了一篇博客受到启发,写了这个方法能一次全部解析出来,希望对大家有所启发。二、建表
新建jsonarray_test表并添加测试数据。CREATE TABLE jsonarray_test ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(10) NOT NULL COMMENT '名称', info json DEFAULT NULL COMMENT 'json数组', UNIQUE KEY (title), KEY id (id) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; REPLACE INTO jsonarray_test(title, info) value ('上证19','[{"Symbol": "600030", "ShortName": "中信证券"}, {"Symbol": "601166", "ShortName": "兴业银行"}, {"Symbol": "600887", "ShortName": "伊利股份"}, {"Symbol": "600000", "ShortName": "浦发银行"}, {"Symbol": "601857", "ShortName": "中国石油"}, {"Symbol": "600999", "ShortName": "招商证券"}, {"Symbol": "601006", "ShortName": "大秦铁路"}, {"Symbol": "601989", "ShortName": "中国重工"}, {"Symbol": "600104", "ShortName": "上海汽车"}, {"Symbol": "601377", "ShortName": "兴业证券"}, {"Symbol": "601390", "ShortName": "中国中铁"}, {"Symbol": "600050", "ShortName": "中国联通"}, {"Symbol": "600048", "ShortName": "保利地产"}, {"Symbol": "600111", "ShortName": "包钢稀土"}, {"Symbol": "601169", "ShortName": "北京银行"}, {"Symbol": "601800", "ShortName": "中国交建"}, {"Symbol": "600547", "ShortName": "山东黄金"}, {"Symbol": "601668", "ShortName": "中国建筑"}, {"Symbol": "601688", "ShortName": "华泰证券"}]'); REPLACE INTO jsonarray_test(title, info) value ('西藏板块','[{"Symbol": "000752", "ShortName": "西藏发展"}, {"Symbol": "000762", "ShortName": "西藏矿业"}, {"Symbol": "600211", "ShortName": "西藏药业"}, {"Symbol": "600326", "ShortName": "西藏天路"}, {"Symbol": "600338", "ShortName": "西藏珠峰"}, {"Symbol": "600749", "ShortName": "西藏旅游"}, {"Symbol": "600773", "ShortName": "西藏城投"}]');
![](http://res.cloudinary.com/changzhou-university/image/upload/v1502420478/2017-08-11_%E8%A1%A8%E6%95%B0%E6%8D%AE_twtdjh.jpg)
三、写查询存储过程
DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_jsonarray_extract`$$ CREATE PROCEDURE `sp_jsonarray_extract`() BEGIN declare v_i int default 1; DROP TABLE IF EXISTS info_incre_table; create table info_incre_table (ID int NOT NULL,PRIMARY KEY (ID))ENGINE=MyISAM DEFAULT CHARSET=utf8; -- 自增临时表 WHILE (v_i<100) DO -- 100代表解json数组的最大长度 insert into info_incre_table values (v_i); SET v_i=v_i+1; END WHILE; select a.title,substring_index(substring_index(replace(replace(replace(replace(JSON_EXTRACT(a.info,'$[*].Symbol'),' ',''),'"',''),'[',''),']',''),',',b.ID),',',-1) as symbol from jsonarray_test a join info_incre_table b on b.ID <= (length(JSON_EXTRACT(a.info,'$[*].Symbol')) - length(replace(JSON_EXTRACT(a.info,'$[*].Symbol'),',',''))+1) order by a.title; END$$ DELIMITER ;
执行SQL:call sp_jsonarray_extract();;
mysql5.7查询结果(是我们想要的):
![](http://res.cloudinary.com/changzhou-university/image/upload/v1502420726/2017-08-11_%E7%BB%93%E6%9E%9C_axe4pr.jpg)
四、说明总结
mysql本身可以这样解析出json数组的所有元素:select title,JSON_EXTRACT(info,’$[*].Symbol’) from jsonarray_test;结果如下,显然这样的结果并不方便我们进行运算和一系列的操作。
![](http://res.cloudinary.com/changzhou-university/image/upload/v1502421196/2017-08-11_111209_datwms.jpg)
我这个小案例其实是基于上面这个结果,将其分解,利用一张自增临时表,避免了循环遍历,一次把结果解出来,但是效率在数据量较大时不是很高。实测解析出3W条记录用时60S左右。本案例希望能对你的工作或学习有所启发。
原文地址:http://www.enjoyown.com/mysql5.7-Jsonarray/
相关文章推荐
- Android如何解析json数组对象
- 如何解析JSON数组,并只拿到其中的一个属性集
- JS解析json数据(如何将json字符串转化为数组)
- 前台的js对象数组传到后台处理。在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>
- Flex解析Json数组
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- JSON-C库的使用(1)Json对象数组的解析
- java解析json数组
- 复杂json的转换 Map 数组 对象 生成 与 解析
- Android 使用fastjson解析json,java数组判断为空的方法
- JS解析json数据(如何将json字符串转化为数组)
- 嵌套的for循环执行顺序。可以让内外for循环交替执行。简单解析json数组。求js中两个时间差值。
- c++ & java解析JSON格式数组
- cocos2d-x把json数据解析到数组或字典中(libjson库)
- Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解
- 从前端获取 json数组,在后端(java)获取并解析输出。
- jsoncpp封装和解析字符串、数字、布尔值和数组
- 解析外层为数组的json串
- json解析转化成数组,字典等类型,nsstring 转换
- js数组转json并在后台对其解析具体实现