• mysql解析json数据组,获取数据组所有字段


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

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

    观察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":"高压泵、机油泵"}
    
    • 1

    去除前后 [ 和 ] 两个list标志,将 },{ 变成 };{ 这样就可以将 ; 变成拆分标识符。如下

    select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest
    
    • 1

    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 )
    ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    到此,就完成了 将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 )
    ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当然通过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 )
    ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    C认证笔记 - 计算机通识 - IP基础
    等保三级测评(MySQL)
    超级详细Spring AI+ChatGPT(java接入OpenAI大模型)
    Java基础数组-选择排序算法
    关于麒麟x86docker问题
    【毕业设计】深度学习 python opencv 实现人脸年龄性别识别
    docker 集群管理实战mesos+zookeeper+marathon(一)
    售卖机控制板开发,轻松实现线下售卖和线上运营
    【Rust日报】2022-12-01 Extism - 使所有软件都可编程扩展
    以创新赋能引领鸿蒙应用开发,凡泰极客亮相华为HDC2024
  • 原文地址:https://blog.csdn.net/m0_67401545/article/details/126113628