mysql解析json数据组获取数据组所有字段的方法实例_Mysql

来源:脚本之家  责任编辑:小易  
目录
引言第一步:一行拆分成多行1.1 新建一张表keyid,只insert从0开始的数字,如下:1.2 找到拆分标识符1.3 通过join on拆分多行第二步:解析json字符串总结 

引言

在开发过程中,遇到过json数据组的字符串,需要解析json组,得到组内所有的信息。如下格式:

[{"itemId":3101,"itemName":"空滤器及进气管道"},{"itemId":3102,"itemName":"水管、水泵"},{"itemId":3103,"itemName":"柴油管道"},{"itemId":3104,"itemName":"高压泵、机油泵"}]

观察json组发现,它是一个list里面包含多个json字符串,我们要做的是拆分出list所有json字符串,并对每个json字符串做解析。

做分析发现,如果是单独一个json字符串,通过 JSON_EXTRACT 方法即可。但是list里面有多个json字符串,所以我们需要对list进行拆分,变成多个json字符串。

在学习本文内容之前,需要提前了解mysql两个函数:

SUBSTRING_INDEX

JSON_EXTRACT

 具体用法,请自行百度,本文不做讲解。

第一步:一行拆分成多行

一行拆成多行,即把list拆分成多行 json,为此我们需要

1.1 新建一张表keyid,只insert从0开始的数字,如下:

在其他的教程中,通过 mysql.help_topic 表的 help_topic_id 字段也是可以的。但是这个库表需要root权限才可以使用。因此建立自己的匹配表,是最合适的。

注意:id的值,不能小于 list里面json字符串的个数。比如上述list里面的json字符串是4个,那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拆分多行

这时候,就可以通过 将maptest表和 新建的 keyid表进行join,用on条件,匹配成多行。在通过 SUBSTRING_INDEX进行拆分。

 代码如下:

select 
a.jsonarr,
SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ) AS jsonarr_info,
b.id
from 
(select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
join 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 itemName
from 
(select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
join 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 itemName
from 
(select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
join mysql.help_topic b 
on b.help_topic_id < ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 )
;

 注意: 通过 JSON_EXTRACT 解析出来的字段,如果是字符串,会带有 "" 双引号,只要replace替换掉即可。

总结 

到此这篇关于mysql解析json数据组获取数据组所有字段的文章就介绍到这了,更多相关mysql解析json数据组内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:mysql全面解析json/数组

  • 本文相关:
  • mysql优化group by方案
  • mysql查询缓存的小知识
  • 关于case when语句的报错问题详解
  • mysql 5.7.17安装后登录mysql的教程
  • windows10下mysql 8.0.22 安装配置方法图文教程
  • mysql排序原理和案例详析
  • mysql主键的缺少导致备库hang住
  • 修改mysql5.5默认编码(图文步骤修改为utf-8编码)
  • win32 mysql 5.7.27 安装配置方法图文教程
  • 详解navicat远程连接mysql很慢
  • mysql 5.7 怎么查看 json_extract函数? mysql 5.6版本的要怎么解...
  • C++下如何将json数据存入mysql数据库
  • 如何将从api接口获取的json数据导入到MySQL中呢?
  • c#如何将mysql数据库中的数据转换成json字符串
  • mysql数据库中某个字段存的是json数据,如何对json数据中的数...
  • json 数据转换存入到mysql
  • 为什么我在postgresql的json数据中查询,速度会比mysql慢很多
  • php下如何将json格式的数据直接存入mysql数据库
  • MySQL插入json问题
  • 详解Mysql中的JSON系列操作函数
  • mysql json 数字可以吗
  • 一个网站有json和xml存储数据为啥还要有mysql数据库呢?小白...
  • 简单谈谈MySQL5.7 JSON格式检索
  • 求救,mysql怎么解析json
  • c#使用Newtonsoft.Json将json字符串中的数据输入到MySQL数...
  • mysql5.6版本怎么对json进行截取某个具体的值(需要详解)
  • 小白求教,这种 json 怎么用 python 解析成参数数组插入 mysql 当...
  • mysql5.7以下怎么解析json
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysqlmysql全面解析json/数组mysql优化group by方案mysql查询缓存的小知识关于case when语句的报错问题详解mysql 5.7.17安装后登录mysql的教程windows10下mysql 8.0.22 安装配置方法图文教程mysql排序原理和案例详析mysql主键的缺少导致备库hang住修改mysql5.5默认编码(图文步骤修改为utf-8编码)win32 mysql 5.7.27 安装配置方法图文教程详解navicat远程连接mysql很慢mysql安装图解 mysql图文安装教程(详细说明)can""""t connect to mysql servwindows下mysql5.6版本安装及配置过程附有截图和mysql字符串截取函数substring的用法说明mysql提示:the server quit withoumysql之timestamp(时间戳)用法详解mysql创建用户与授权方法mysql——修改root密码的4种方法(以windows为mysql查看版本号的几种方式mysql日期数据类型、时间类型使用总结mysql 如何实现多张无关联表查询数据并分页mysql my.ini 配置文件详解window下mysql 8.0.15 winx64安装配置方法图文教程mysql中b树索引和b+树索引的区别详解基于sql中的数据查询语句汇总mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\msql模糊查询报:ora-00909:参数个数无效问题的解决12个优化mysql的技巧小整理mysql如何同时交换两个表的表名详解mysql错误:can’t open file: ‘××
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved