引言
在开发过程中,遇到过%ignore_a_1%数据组的字符串,需要解析json组,得到组内所有的信息。如下格式:
[{"itemId":3101,"itemName":"空滤器及进气管道"},{"itemId":3102,"itemName":"水管、水泵"},{"itemId":3103,"itemName":"柴油管道"},{"itemId":3104,"itemName":"高压泵、机油泵"}]
观察json组发现,它是一个list里面包含多个json字符串,我们要做的是拆分出list所有json字符串,并对每个json字符串做解析。
分析后发现,当JSON字符串独立存在时,可以使用JSON_EXTRACT方法进行提取。由于列表中包含多个JSON字符串,因此我们需要将列表拆分为多个JSON字符串。
在学习本文内容之前,需要提前了解mysql两个函数:
SUBSTRING_INDEXJSON_EXTRACT
第一步:一行拆分成多行
一行拆成多行,即把list拆分成多行 json,为此我们需要
1.1 新建一张表keyid,只insert从0开始的数字,如下:

在其他的教程中,通过 mysql.help_topic 表的 help_topic_id 字段也是可以的。但是这个库表需要root权限才可以使用。因此建立自己的匹配表,是最合适的。
注意:id的值,不能小于 list里面json字符串的个数。举例来说,如果在上述列表中有4个JSON字符串,那么id值必须大于4。help_topic_id最大值是700,如果list里面json字符串的个数大于这个值,用help_topic_id是不合适的。
1.2 找到拆分标识符
所谓拆分标识符,就是能根据此符号,一次性拆分成多行的标志。在下面list当中,没有找到拆分标识符,因此需要处理一下。可以将 ; 当成拆分标识符。处理后的内容如下:
{"itemId":3101,"itemName":"空滤器及进气管道"};{"itemId":3102,"itemName":"水管、水泵"};{"itemId":3103,"itemName":"柴油管道"};{"itemId":3104,"itemName":"高压泵、机油泵"}
去除前后 [ 和 ] 两个list标志,将 },{ 变成 };{ 这样就可以将 ; 变成拆分标识符。如下
select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest

1.3 通过join on拆分多行
此时,我们可以通过使用JOIN操作将maptest表和新建的keyid表连接起来,在ON条件下匹配多行数据。在通过 SUBSTRING_INDEX进行拆分。

代码如下:
select a.jsonarr,SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ) AS jsonarr_info,b.idfrom (select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) ajoin keyid b on b.id< ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 );
到此,就完成了 将json组,拆分成多行的工作。
第二步:解析json字符串
拆分成多行之后,就可以通过 JSON_EXTRACT 进行解析了。效果如下:

完成代码如下:
select a.jsonarr,SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ) AS jsonarr_info,b.id,JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ), '$[0].itemId') as itemId,replace(JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ), '$[0].itemName'),'"','') as itemNamefrom (select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) ajoin keyid b on b.id< ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 );
当然通过 mysql.help_topic 表的 help_topic_id 字段也是可以。代码和结果如下:

select a.jsonarr,SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ) AS jsonarr_info,b.help_topic_id,JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ), '$[0].itemId') as itemId,replace(JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ), '$[0].itemName'),'"','') as itemNamefrom (select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) ajoin mysql.help_topic b on b.help_topic_id < ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 );
注意: 通过 JSON_EXTRACT 解析出来的字段,如果是字符串,会带有 “” 双引号,只要replace替换掉即可。
以上就是mysql解析json数据组怎么获取数据组所有字段的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/152913.html
微信扫一扫
支付宝扫一扫