文章目录

  • 前言
  • 一、数据的插入
  • 二、查询数据
    • 1.插入数据
    • 2.查询数据
  • 总结

前言

比如,有个List<AlarmInfo>对象需要存储到mysql中,我们可以存储为varchar类型,也可以存储为json
但是,在读取的时候我们需要他能够和实体类中的字段需要可以映射上,但是如果就这么做,很遗憾返回的是null,接下来记录下这个问题的解决方法。

一、数据的插入

使用增强型的mybatis-plus很容易实现DAO层的数据处理,在实体类中定义了如下字段:

   @ApiModelProperty(value = "告警类型以及对应状态")@TableField(typeHandler = FastjsonTypeHandler.class)private List<AlarmInfo> alarmContent;

mysql中我们定义该字段类型为:
alarm_content json DEFAULT NULL,

使用alartMapper进行数据插入:

  @Override@Transactional(rollbackFor = Exception.class)public void saveOrUpdate(AlarmDTO alarmDTO) {Alarm alarm = Alarm.builder().metricName(alarmDTO.getMetricName()).dimensions(alarmDTO.getDimensions()).compareDay(alarmDTO.getCompareDay()).thresholdMin(alarmDTO.getThresholdMin()).thresholdMax(alarmDTO.getThresholdMax()).status(alarmDTO.getStatus()).alarmContent(alarmDTO.getAlarmContent()).alarmTime(alarmDTO.getAlarmTime()).build();if (alarmDTO.getId() != null && alarmDTO.getId() != 0) {alarm.setId(alarmDTO.getId());alarmMapper.updateById(alarm);} else {alarmMapper.insert(alarm);}}

这一步数据是OK的,形如:[{“type”: “1111”, “value”: “11111”}],但是如果还是使用List<AlarmInfo>进行数据接收,发现得到的数据为空,感兴趣的话可以自行验证。
所以下面就是一个解决方案,可供参考。

二、查询数据

1.插入数据

代码如下(示例):

 // 1. 字段类型定义@TableField(typeHandler = FastjsonTypeHandler.class)private List<AlarmInfo> alarmContent;

2.查询数据

这里定义下返回数据的DTO, 同样这里需要使用FastJson进行转义。

@Data
@TableName(value = "t_alarm", autoResultMap = true)
@ApiModel(description = "告警规则AlarmDTO")
public class AlarmDTO {@ApiModelProperty(value = "告警类型以及对应状态")@TableField(typeHandler = FastjsonTypeHandler.class)private List<AlarmInfo> alarmContent;

然后很关键的一步是需要在mapper的xml文件中定义返回结果的数据类型转换器:

    <resultMap id="BaseResultMap" type="com.xx.enity.dto.AlarmDTO"><result column="alarm_content" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"property="alarmContent"/></resultMap><select id="queryPage" resultMap="BaseResultMap" parameterType="com.xx.enity.dto.AlarmQueryDTO">SELECT alarm_contentFROM t_alarmWHERE 1<if test="queryDTO.metric_name != null and queryDTO.metric_name !='' ">AND metric_name = #{queryDTO.metric_name}</if><if test="queryDTO.keyword != null and queryDTO.keyword.trim() != '' ">AND ( alarm_content LIKE #{queryDTO.keyword} OR dimensions LIKE #{queryDTO.keyword} )</if></select>

最后通过List<AlarmDTO> alarmList = alarmService.queryAll(null); 查询的List<AlarmInfo> 它其实并不是AlarmInfo对象,它其实等价于List<JSONObject>, 所以使用下面方法进行转义下,转为自己需要的对象进行处理。

    private List<AlarmInfo> getAlarmContent(AlarmDTO alarm) {List<AlarmInfo> alarmContentJsonObj = alarm.getAlarmContent();String json = JSON.toJSONString(alarmContentJsonObj);List<AlarmInfo> alarmContent = JSONObject.parseArray(json, AlarmInfo.class);return alarmContent;}

总结

总之,使用JSON存可以,但是查询的话需要转义而且查询的结果为JSON对象,需要我们将其转为指定的对象才能进行方便的操作。

SpringBoot有关数组对象转JSON相关推荐

  1. 多数组对象转为json数组格式

    JS多数组对象转为json数组 在工作中经常会遇到接口获取的数据结构与需要的数据结构不同的情况,这就需要我们自己把接口数据改为我们需要的格式. 情况一: var resData = {datetime ...

  2. 数组对象,JSON.parse()解析

    数组对象,JSON.parse()解析 let arr = [ {name : '王渊' , age : '20' , py :'[{boy : 'zhansan ' },{ girl : 'xiao ...

  3. 找出数组对象(json数组)中重复的项

    欢迎关注微信公众号:[ 全栈攻略 ] 我们做的最多的业务场景是去重,今天遇到的需求是找出数组对象中重复的项 直接上代码: let arr = [{id: 1, sku: 101, name: 'sku ...

  4. springboot 接受数组对象_SpringBoot+RabbitMQ 方式收发消息

    本文来源:juejin.im/post/6859152029823008781 本篇会和SpringBoot做整合,采用自动配置的方式进行开发,我们只需要声明RabbitMQ地址就可以了,关于各种创建 ...

  5. postman 传递数组对象_postman json请求参数向JAVA后台传对象以及数组

    一,JSON格式传递实体类对象,postman请求参数格式如下(Headers请求头添加 Content-Type:application/json) 后台接收如下(@ResponseBody用于数据 ...

  6. SpringBoot将自定义对象转JSON对象问题研究

    SpringBoot JSON序列化自定义对象研究 1. 问题描述 1.1 工程代码 1.2 测试 2. 问题分析 2.1 初步分析结论 2.2 实验验证结论 2.3 问题拓展 3. 结论 摘要(干货 ...

  7. springboot 接受数组对象

    做业务时,遇到了接受数组的需求,上传文件提示报错: 查看上传请求,数组传了个[object object],.......

  8. json 解析 转java对象数组对象数组对象_json字符串转java对象数组

    需要引入json-lib-2.2-jdk15.jar和ezmorph-1.0.6.jar包 String itemStar = request.getParameter("itemStar& ...

  9. JavaScript对象、JSON对象、JSON字符串的区别

    一.首先看下什么是JSON JSON:JavaScript Object Natation,JavaScript对象的表现形式,已经发展成一种轻量级的数据交换格式. JavaScript对象的表现形式 ...

最新文章

  1. 2021年春季学期-信号与系统-第二次作业参考答案-第十小题
  2. C 引用和指针的区别
  3. Scala操作外部数据
  4. python2默认编码_解决Python2.x编码之殇
  5. [翻译]你或许还未听说过的一些ASP.NET 2.0要诀
  6. java学习笔记2021.1.10
  7. Permission denied (publickey). fatal: Could not read from remote repository.
  8. 深度使用魅族16T后的评价(本人魅友,绝对客观公正,不要盲目的为手机厂商辩护,想想从当初到现在,魅族正在一步步背离自己的信仰,有问题,解决问题才能有更好的发展)
  9. VS2017创建ASP.NET Core Web程序
  10. pku2503 Babelfish
  11. Elasticsearch模块功能之-索引分片分配(Index shard allocation)
  12. jsp:include和%@include file=%的区别(简单了解)
  13. cobbler 部署
  14. java实现socket网络编程
  15. 爬虫之异步爬虫asyncio
  16. Java定时任务自动调用方法
  17. 正则校验整数,校验小数位,校验2-4位小数位,正整数长度可控制
  18. 数据结构学习笔记(7.查找 8.排序)
  19. 从大陆访问,阿里云和腾讯云的香港云服务器,哪个更快?
  20. 全文收索服务-solr介绍

热门文章

  1. Navicate无法连接,提示is not allowed to connect to this mysql server
  2. 金额的每三位一个逗号的正则解法
  3. 只要35+的程序员,招聘广告开始玩噱头?
  4. html制作菱锥旋转,Flash 3d效果精彩实例:制作旋转的三棱锥
  5. JAVA中Object转String
  6. CSDN 上如何设置「关注博主」即可阅读全文
  7. 【Linux】WARNING: The script locust is installed in ‘/home/xxx/bin‘ which is not on PATH.
  8. Android进程保活(黑白手段让APP活下去)
  9. python黑白像素面积占比计算(脏污、白点等)
  10. python循环语句打印三角形_python循环输出三角形图案的例子