前后端接口出现参数字段为Json的处理方法
前段时间阿里的老大安排我开发了一个工单保存申请的接口,该接口入参VO中包含一个formData的字段,这个字段中的内容是不是后端定义的,而是前端定义好之后转换为一个Json形式的数据传递到后端然后入库。
1) 最初的设计方案:
fromData字段定义成字符串,前端将要传递的数据序列化为json字符串,然后放到这个formData中传递到后端,这个方法需要前端将请求参数进行转义,然后传递到后端程序中也没有什么问题,json数据也可以平稳落库;
2)遇到的问题:
但是在开发详情接口将formData字段的数据从数据库中取出返回给前端时,发生了一个问题,就是出参中formData这个字段的数据包含了大量的>的转义符号,
3) 产生问题的原因:
出现这个问题的原因就是详情接口出参VO中formData也是字符串,这样出参中该字段就是字符串套字符串,双引号套双引号,就会产生双引号转义的问题。设计新增接口和详情接口时,formData这个字段不应该设计成String字符串,否则不管是新增时前端将数据传给后端,还是查询时后端将数据传给前端,都要对该字段的数据进行转义。
4) 解决方案
一、将新增接口WorkOrderCreateReqVo和查询接口WorkOrderDetailResVo中的formData这个字段设计成Object类型,然后将WorkOrderCreateReqBo的formData也设计成Object,在使用mapstruct将请求Bo转换为entity时使用fastJson的JSON.toJSONString将Object转换为json字符串并入数据库。
入参转换模型:
Vo (Object) ---------------------------> Bo(Object) ----------Json.toJSONString----------> Entity
二、详情接口出参时entity先转换为WorkOrderDetailResBo,然后使用mapstruct将WorkOrderDetailResBo转换为WorkOrderDetailResVo时使用JSON.parse方法
将字符串String转换为Objcet类型;
出参转换模型:
Entity---------------------------> Bo(String) ----------Json.parse----------> Vo(Object)
提示:对象模型转为不一定要用mapstruct,同类型的框架也有很多,数据序列化和反序列化也不一定要用fastJson,而且最近fastJson风评不好,推荐使用老牌Jackson.