后端接收JsonObject 并 转换为实体类对象,以及复杂对象存入数据库的解决思路

1. 问题描述

之前在SpringBoot中,Controller 层一直用实体类去接收Json字符串,这样的好处就是只要实体类的结构与Json的结构一一对应,就可以很方便的接收,不用再进行转换处理。
在这里插入图片描述但是有时候采用这种方式接收的实体类不方便存入数据库,比如说下面这个实体类,含有List和 Map ,存入数据库中很不方便:
实体类: LongtermDispatchPlanConParamDTO

public class LongtermDispatchPlanConParamDTO {
	private String schedulingplanName;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date maketime;
    private String userName;
    private List<StationParameter> stationParameterList; 
	private Map<String,List<Constraintltem>> stationConstraintMap;
}

2. 解决思路

我的解决思路是这样的

  1. 在上面类中,前三个属性定义为主键字段,另增一个字段存储从前端传过来的整个Json字符串(这里类型定义为CLOB,以免超出varchar2 的 4000长度)

表 LONGTERM_DISPATCHPLAN_CON:
在这里插入图片描述对应实体类:

public class LongtermDispatchplanConEntity implements Serializable {
	private static final long serialVersionUID = 1L;
	
	@Id
	private String schedulingplanName;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Id
	private Date maketime;
    @Id
	private String userName;

	private String jsonString;


}
  1. 写好操作上表的增删改查
  2. Controller接收时用 cn.hutool.json.JSONObject 接收,然后将JSONObject 转化为结构一致的实体类对象LongtermDispatchPlanConParamDTO ,构造 LongtermDispatchplanConEntity对象存入数据库
@PostMapping("/insertListbyDTOJson")
     public void insertListbyDTOLongtermDispatchplanCon( @RequestBody JSONObject jsonParam) {
     	
    	 // 将JSONObject 转换为 对应的Bean对象
     	Class<LongtermDispatchPlanConParamDTO> clazzClass = LongtermDispatchPlanConParamDTO.class;
        LongtermDispatchPlanConParamDTO dto = jsonParam.toBean(clazzClass);
        
        //将JSONObject 以LongtermDispatchplanConEntity 中的 jsonString字符串形式存入数据库 
        LongtermDispatchplanConEntity ldpConEntity = new  LongtermDispatchplanConEntity();
        // 复制部分属性
        BeanUtils.copyProperties(dto, ldpConEntity);
        // 赋值 jsonString
        ldpConEntity.setJsonString(jsonParam.toString());
        // 存入数据库
        longtermDispatchplanConDao.save(ldpConEntity);
        log.info("longtermdispatchplancon insertListbyDTOJson success");
     }
     

在这里插入图片描述
4. 在返回Json字符串时,前端传过来主键信息,从数据库去取出LongtermDispatchplanConEntity,然后 构造 LongtermDispatchPlanConParamDTO,前端就可以正确接收了。

@PostMapping("/getByIds")
     public LongtermDispatchPlanConParamDTO getByIdsLongtermDispatchplanCon( @RequestBody LongtermDispatchplanConParamsVO2  p) {
    	 LongtermDispatchplanConParamsVO lp = new  LongtermDispatchplanConParamsVO();
         BeanUtils.copyProperties(p, lp);
         // 根据 LongtermDispatchplanConParamsVO 从表中查询LongtermDispatchplanConEntity
         List<LongtermDispatchplanConEntity> ldpConEntitys = longtermDispatchplanConDaoM.findByIds(lp);
         
         if(ldpConEntitys !=null) {
        	 LongtermDispatchplanConEntity ldpConEntity = ldpConEntitys.get(0);
        	 //获得json字符串
        	 String jsonString = ldpConEntity.getJsonString();
        	 //利用 json字符串构造JSONObject对象
        	 JSONObject jsonParam = new JSONObject(jsonString,false);
        	 //转换为 LongtermDispatchPlanConParamDTO对象
        	 Class<LongtermDispatchPlanConParamDTO> clazzClass = LongtermDispatchPlanConParamDTO.class;
             LongtermDispatchPlanConParamDTO dto = jsonParam.toBean(clazzClass);
             return dto;
         }
         else {
        	 throw new DataException(200, p.toString()+"没有信息");
         }
         
     }

上面用的操作Json 的都是来自 Hutool的,真是很好的工具

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSONObject 转换实体类的过程可以分为以下几个步骤: 1. 通过 JSONObject 的 get 方法获取需要的数据项; 2. 将获取到的数据项转换实体类对应的类型; 3. 使用转换后的数据项设置实体类的属性值。 下面是一个示例代码: 假设有以下的 JSON 数据: ``` { "name": "Tom", "age": 18, "gender": "male", "address": { "province": "Guangdong", "city": "Shenzhen" } } ``` 对应的实体类如下: ``` public class Person { private String name; private int age; private String gender; private Address address; // 省略 getter 和 setter 方法 } public class Address { private String province; private String city; // 省略 getter 和 setter 方法 } ``` 那么,将 JSONObject 转换为 Person 实体类的代码如下: ``` public Person parse(JSONObject json) { Person person = new Person(); person.setName(json.getString("name")); person.setAge(json.getInt("age")); person.setGender(json.getString("gender")); JSONObject addressJson = json.getJSONObject("address"); Address address = new Address(); address.setProvince(addressJson.getString("province")); address.setCity(addressJson.getString("city")); person.setAddress(address); return person; } ``` 以上代码中,我们通过 JSONObject 的 getString、getInt 和 getJSONObject 方法获取了对应的数据项,并将其转换实体类对应的类型。最后,使用转换后的数据项设置了实体类的属性值,最终返回转换后的实体类对象

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值