SQLSERVER,MySQL JSON字段解析

本文探讨了如何在SQL Server中使用自定义函数fn_split和fn_parsejson解析不一致的JSON字符串,同时展示了与MySQL中JSON_EXTRACT函数的使用方法。通过实例说明了如何获取特定键的值,适用于临时查询需求。

1.SQLSERVER JSON解析

背景:

最近在维护一个老的项目,发现数据库中某字段存储的JSON字符串,有些失败信息JSON格式还存在不一致,经常会查询这部分数据提供给下游,但是下游只需要错误描述信息,由于数据都是临时查询的,每次都不固定,所以在数据库中直接用函数进行进行JSON格式 并返回详细的描述信息。增加2个函数并调用

1.解析字符串函数

CREATE FUNCTION [dbo].[fn_split](@p_str VARCHAR(8000), @p_split VARCHAR(10))
RETURNS @tab TABLE(tid VARCHAR(2000))
AS
BEGIN
DECLARE @idx INT
DECLARE @len INT
SELECT @len = LEN(@p_split), @idx = CHARINDEX(@p_split, @p_str, 1)
WHILE(@idx >= 1)
BEGIN
INSERT INTO @tab SELECT LEFT(@p_str, @idx - 1)
SELECT @p_str = RIGHT(@p_str, LEN(@p_str) - @idx - @len + 1), @idx = CHARINDEX(@p_split, @p_str, 1)
END
if(@p_str <> '') INSERT INTO @tab SELECT @p_str
RETURN
END;

2.解析JSON字符串

CREATE FUNCTION [dbo].[fn_parsejson]
(@p_jsonstr VARCHAR(8000),@p_key VARCHAR(200)) 
RETURNS VARCHAR(3000)
AS      
BEGIN
DECLARE @rtnVal VARCHAR(3000);
  DECLARE @i INT;
  DECLARE @jsonkey VARCHAR(200);
  DECLARE @jsonvalue VARCHAR(1000);
  DECLARE @json VARCHAR(8000);
  DECLARE @tmprow VARCHAR(2000);
  DECLARE @tmpval VARCHAR(2000);
  
  IF(@p_jsonstr IS NOT NULL)
BEGIN
     SET @json = REPLACE(@p_jsonstr, '{', '');
     SET @json = REPLACE(@json, '}', '');
     SET @json = REPLACE(@json, '"', '');
DECLARE @json_cur CURSOR;  -- 声明外层游标
SET @json_cur = CURSOR FOR SELECT tid FROM fn_split(@json, ',');
OPEN @json_cur-- 打开游标(外层游标)
FETCH NEXT FROM @json_cur INTO @tmprow-- 提取外层游标行
WHILE(@@FETCH_STATUS = 0)
BEGIN
IF(@tmprow IS NOT NULL)
BEGIN
SET @i = 0;
SET @jsonkey = '';
SET @jsonvalue = '';

DECLARE @str_cur CURSOR;-- 声明内层游标
SET @str_cur = CURSOR FOR SELECT tid FROM fn_split(@tmprow, ':');--第二次拆分后的游标(内层游标)
OPEN @str_cur  -- 打开游标
FETCH NEXT FROM @str_cur INTO @tmpval-- 提取内层游标行

WHILE(@@FETCH_STATUS = 0)
BEGIN
IF(@i = 0) 
BEGIN
SET @jsonkey = @tmpval
END
IF(@i = 1)
BEGIN
SET @jsonvalue = @tmpval
END

SET @i = @i + 1

FETCH NEXT FROM @str_cur into @tmpval-- 内层游标下移一行
END

CLOSE @str_cur-- 关闭内层游标
DEALLOCATE @str_cur -- 释放内层游标

IF(@jsonkey = @p_key)
BEGIN
SET @rtnVal = @jsonvalue
END
END

FETCH NEXT FROM @json_cur INTO @tmprow-- 内层游标结束后,外层游标下移一行
END

CLOSE @json_cur-- 关闭外层游标
DEALLOCATE @json_cur-- 释放外层游标
END 
  RETURN @rtnVal  
END

3.函数调用

DECLARE @HandleResultStr NVARCHAR(128);
SET @HandleResultStr='{"response":{"content":{"code":500,"message":"数据不存在!","success":false}, "code":0}}'
SELECT [dbo].[fn_parsejson](@HandleResultStr,'message')

2.MySQL 解析JSON 字符串

SELECT remark,JSON_EXTRACT(JSON_EXTRACT(JSON_EXTRACT(remark,'$.response'),'$.content'),'$.message')
FROM  orm_dept WHERE id =1

image-20220520170000318

### Spring Boot 中处理 MySQL JSON 字段 在现代 Web 开发中,处理 JSON 数据已经成为不可或缺的一部分。对于基于 Java 的应用程序而言,Spring Boot 结合 MyBatis-Plus 和 MySQL 8.0 提供了一种强大而灵活的方式来管理这些复杂的数据结构。 #### 使用 LIKE 操作符进行 JSON 查询 一种简单的方式是通过 SQL 的 `LIKE` 关键字来匹配 JSON 文档内的特定模式[^1]: ```sql SELECT * FROM my_table WHERE JSON_UNQUOTE(JSON_EXTRACT(data_column, '$.key')) LIKE '%value%'; ``` 这种方法适用于简单的字符串搜索场景,但对于更复杂的查询可能不够理想。 #### 利用 MyBatis-Plus 实现高级功能 为了更好地支持 JSON 类型,在实体类定义时可以引入 Jackson 库来进行序列化/反序列化的操作[^3]。下面是一个具体的例子展示如何配置以及编写代码完成这一目标: ```java import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.databind.JsonNode; public class TestEntity { private Integer id; @TableField(typeHandler = JsonTypeHandler.class) private JsonNode txt; // getters and setters... } ``` 这里使用了自定义的 TypeHandler 来确保当读取或写入数据库记录的时候能够正确转换 JSON 格式的列值。 #### 创建带有 JSON 支持的表结构 创建一张包含 JSON 字段的新表格可以通过如下 DDL 语句实现: ```sql CREATE TABLE `my_test` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `txt` JSON DEFAULT NULL, `txt_array` JSON DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=46 DEFAULT CHARSET=UTF8MB4 COLLATE=utf8mb4_0900_ai_ci; ``` 此命令会建立两个允许存储任意长度 JSON 数组或者对象类型的字段(txt 和 txt_array),并设置合适的字符集编码以适应多语言环境下的需求。 #### 插入测试数据到含有 JSON 字段的表里 向上述新建好的表插入一些初始数据以便后续验证逻辑是否正常工作: ```sql INSERT INTO `my_test`(txt, txt_array) VALUES ('{"name": "Alice", "age": 25}', '["apple", "banana"]'); ``` 这一步骤非常重要因为它不仅帮助开发者理解实际业务流程还便于调试过程中快速定位潜在问题所在。 #### 启动 Spring Boot 应用程序连接至 MySQL 数据库 最后要做的就是确保项目能成功启动并与指定的目标数据库实例建立起稳定可靠的通信链路。通常情况下只需要修改 application.properties 文件里的相应参数即可满足基本要求[^2]: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password ``` 以上即是在 Spring Boot 环境下针对 MySQL 数据库存储及检索 JSON 数据的一个完整解决方案概述。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值