java 对象数据映射_SpringMVC中json数据映射为java对象的坑
在开发过程中,我们对外提供的服务可以抽成两大块,一块是不变的,即我们抽象出来的请求头,一块是根据不同的接口而不同的请求体。
packagecom.bijian.study.dto;public class BaseRequest{privateCommonReqHeaderDTO commonReqHeaderDTO;privateT data;publicCommonReqHeaderDTO getCommonReqHeaderDTO() {returncommonReqHeaderDTO;
}public voidsetCommonReqHeaderDTO(CommonReqHeaderDTO commonReqHeaderDTO) {this.commonReqHeaderDTO =commonReqHeaderDTO;
}publicT getData() {returndata;
}public voidsetData(T data) {this.data =data;
}
}
而我们在测试过程发现一个小小的问题,如果对方传的json串都是字符串类型的,则会原封不动地映射到我们的java对象上。但如果对方有传非字符串的值,如25.60,则到映射到对象的值则为25.6,由于我们是面向公网的服务,会对请求过来的数据进行验签,如请求方验签的是25.60,而我们验签的值为成了25.6,则会验签不通过。所以,我特意分析了一下。记录如下:
1.不管是数值还是非数值的的,让请求方统一按字符串传。
2.在我们的系统,每一个请求体都定义一个对象,如这里的BatchOper.java
@ResponseBody
@RequestMapping(value="/addUser", method=RequestMethod.POST)public BaseResponse addUser(HttpServletRequest request, HttpServletResponse response, @RequestBody BaseRequestbaseRequest) {
logger.info("第三方请求,请求参数:{}", JsonUtil.toFullJson(baseRequest));return null;
}
packagecom.bijian.study.dto;importjava.math.BigDecimal;importcom.bijian.study.mapper.CustomBigDecimalSerialize;importcom.bijian.study.mapper.CustomDoubleSerialize;importcom.fasterxml.jackson.databind.annotation.JsonSerialize;public classBatchOper {//批次交易订单号
privateString batchOrderId;//汇总笔数
private inttotalCount;//汇总金额
privateBigDecimal totalAmount;
privateDouble totalAmount2;privateBigDecimal totalAmount3;//文件名称
privateString fileName;publicString getBatchOrderId() {returnbatchOrderId;
}public voidsetBatchOrderId(String batchOrderId) {this.batchOrderId =batchOrderId;
}public intgetTotalCount() {returntotalCount;
}public void setTotalCount(inttotalCount) {this.totalCount =totalCount;
}publicBigDecimal getTotalAmount() {returntotalAmount;
}public voidsetTotalAmount(BigDecimal totalAmount) {this.totalAmount =totalAmount;
}publicDouble getTotalAmount2() {returntotalAmount2;
}public voidsetTotalAmount2(Double totalAmount2) {this.totalAmount2 =totalAmount2;
}publicBigDecimal getTotalAmount3() {returntotalAmount3;
}public voidsetTotalAmount3(BigDecimal totalAmount3) {this.totalAmount3 =totalAmount3;
}publicString getFileName() {returnfileName;
}public voidsetFileName(String fileName) {this.fileName =fileName;
}
}
请求的JSON串如下:
{"commonReqHeaderDTO":{"headReqDate":"20180208","headReqTime":"01241401978"},"data":{"batchOrderId":"0417775230004","totalCount":5,"totalAmount":"252.60","totalAmount2":25.80,"totalAmount3":125.50,"fileName":"/20180417/cs-gdgthzz041702.txt"}}
输出日志如下:
21:13:14.044 INFO com.bijian.study.controller.UserController 67 addUser - 第三方请求,请求参数:{"commonReqHeaderDTO":{"headReqDate":"20180208","headReqTime":"01241401978"},"data":{"batchOrderId":"0417775230004","totalCount":5,"totalAmount":252.60,"totalAmount2":25.8,"totalAmount3":125.50,"fileName":"/20180417/cs-gdgthzz041702.txt"}}
我们不难发现,BigDecimal和String类型的末尾的0还是保留,即正常映射了,但Double类型的则丢掉了最后的0。
因此,方法二就是每一个请求体都定义一个映射对象,数字类型的可以为String,也可以是BigDecimal。
但,对于Double,我们是否还有其它方法呢?这时,我们不难想到SpringMVC的自定义转换器。
packagecom.bijian.study.mapper;importjava.io.IOException;importjava.text.DecimalFormat;importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.SerializerProvider;public class CustomDoubleSerialize extends JsonSerializer{private DecimalFormat df = new DecimalFormat("##.0000");
@Overridepublic voidserialize(Double value, JsonGenerator gen, SerializerProvider serializers)throwsIOException, JsonProcessingException {if(value != null) {//gen.writeString(df.format(value));//转换成字符串
gen.writeNumber(df.format(value));
}
}
}
packagecom.bijian.study.mapper;importjava.io.IOException;importjava.math.BigDecimal;importjava.text.DecimalFormat;importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.SerializerProvider;public class CustomBigDecimalSerialize extends JsonSerializer{private DecimalFormat df = new DecimalFormat("##.000");
@Overridepublic voidserialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers)throwsIOException, JsonProcessingException {if(value != null) {//gen.writeString(df.format(value));
gen.writeNumber(df.format(value));
}
}
}
然后需要给需要转换的属性上面加上注解,如下在totalAmount、totalAmount2分别加上自定义转换器。
packagecom.bijian.study.dto;importjava.math.BigDecimal;importcom.bijian.study.mapper.CustomBigDecimalSerialize;importcom.bijian.study.mapper.CustomDoubleSerialize;importcom.fasterxml.jackson.databind.annotation.JsonSerialize;public classBatchOper {//批次交易订单号
privateString batchOrderId;//汇总笔数
private inttotalCount;//汇总金额
@JsonSerialize(using=CustomBigDecimalSerialize.class)privateBigDecimal totalAmount;
@JsonSerialize(using=CustomDoubleSerialize.class)privateDouble totalAmount2;privateBigDecimal totalAmount3;//文件名称
privateString fileName;publicString getBatchOrderId() {returnbatchOrderId;
}public voidsetBatchOrderId(String batchOrderId) {this.batchOrderId =batchOrderId;
}public intgetTotalCount() {returntotalCount;
}public void setTotalCount(inttotalCount) {this.totalCount =totalCount;
}publicBigDecimal getTotalAmount() {returntotalAmount;
}public voidsetTotalAmount(BigDecimal totalAmount) {this.totalAmount =totalAmount;
}publicDouble getTotalAmount2() {returntotalAmount2;
}public voidsetTotalAmount2(Double totalAmount2) {this.totalAmount2 =totalAmount2;
}publicBigDecimal getTotalAmount3() {returntotalAmount3;
}public voidsetTotalAmount3(BigDecimal totalAmount3) {this.totalAmount3 =totalAmount3;
}publicString getFileName() {returnfileName;
}public voidsetFileName(String fileName) {this.fileName =fileName;
}
}
这时,我们同样用上面的json串请求,输出日志如下:
21:20:28.512 INFO com.bijian.study.controller.UserController 67 addUser - 第三方请求,请求参数:{"commonReqHeaderDTO":{"headReqDate":"20180208","headReqTime":"01241401978"},"data":{"batchOrderId":"0417775230004","totalCount":5,"totalAmount":252.600,"totalAmount2":25.8000,"totalAmount3":125.50,"fileName":"/20180417/cs-gdgthzz041702.txt"}}
但,这种方式在我们的项目中还是不可取,因为不可能把所有请求体都定义出来,这样就达不到我们原来特意做成抽象类的目的了。最后我的方法是在验签前,对JSON串中的有小数点的数字类型的小数做补0处理。方法如下所示:
jsonStr = jsonStr.replaceAll("\\.0,", ".00,");
jsonStr= jsonStr.replaceAll("\\.0}", ".00}");
jsonStr= jsonStr.replaceAll("\\.1,", ".10,");
jsonStr= jsonStr.replaceAll("\\.1}", ".10}");
jsonStr= jsonStr.replaceAll("\\.2,", ".20,");
jsonStr= jsonStr.replaceAll("\\.2}", ".20}");
jsonStr= jsonStr.replaceAll("\\.3,", ".30,");
jsonStr= jsonStr.replaceAll("\\.3}", ".30}");
jsonStr= jsonStr.replaceAll("\\.4,", ".40,");
jsonStr= jsonStr.replaceAll("\\.4}", ".40}");
jsonStr= jsonStr.replaceAll("\\.5,", ".50,");
jsonStr= jsonStr.replaceAll("\\.5}", ".50}");
jsonStr= jsonStr.replaceAll("\\.6,", ".60,");
jsonStr= jsonStr.replaceAll("\\.6}", ".60}");
jsonStr= jsonStr.replaceAll("\\.7,", ".70,");
jsonStr= jsonStr.replaceAll("\\.7}", ".70}");
jsonStr= jsonStr.replaceAll("\\.8,", ".80,");
jsonStr= jsonStr.replaceAll("\\.8}", ".80}");
jsonStr= jsonStr.replaceAll("\\.9,", ".90,");
jsonStr= jsonStr.replaceAll("\\.9}", ".90}");
java 对象数据映射_SpringMVC中json数据映射为java对象的坑相关推荐
- jmeter的java请求参数设置_Jmeter中json数据参数化、断言设置
第一步:光标定位到测试计划上,右键菜单"添加" -> Threads(users) -> 线程组,如下图 第二步: 光标定位到线程组,右键菜单选择 "添加&q ...
- android libbfaac.so,Android中Json数据读取与创建
一: Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...
- Asp.net中Json数据的转化,读取与应用
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,而且它是基于JavaScript 的. JSON采用完全独立 ...
- js html 处理json数据,JS中Json数据的处理和解析JSON数据的方法详解
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...
- IOS中JSON数据的解析
IOS中JSON数据解析 官方为我们提供的解析JSON数据的类是NSJSONSerialization,首先我们先来看下这个类的几个方法: + (BOOL)isValidJSONObject:(id) ...
- java代码转置sql数据_SQL Server中的数据科学:数据分析和转换–使用SQL透视和转置
java代码转置sql数据 In data science, understanding and preparing data is critical, such as the use of the ...
- java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js
[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js 0 2015-11-30 20:00:06 IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,u ...
- java实现读取excel表格中的数据,兼容xls和xlsx
前言 利用 java 实现读取 excel 表格中的数据,兼容 xls 与 xlsx 格式,不用额外做区分,写不同的实现方法. 引入的依赖包 <dependency><groupId ...
- 表格中json数据展示
表格中json数据展示 表格中有的列后端返回的是json格式,可以用 el-popover 来展示 <template slot-scope="scope"><e ...
- SpringMVC响应的方式,无数据跳转页面,带数据跳转页面.Json数据返回
SpringMVC响应的方式,无数据跳转页面,带数据跳转页面.Json数据返回 页面跳转设定 //转发会把后端携带的request和Response发送到前端jsp,在jsp中可以直接使用其中的数据/ ...
最新文章
- 颠覆认知——Redis会遇到的15个「坑」,你踩过几个?
- 【引用】Linux常用的日志文件解说及常用系统命令
- BZOJ-3110-K大数查询-ZJOI2013-整体二分
- 小程序----面试题总结
- Linux 的命令终端(CMD)的快捷键(Keyboard of MacBook)
- 宏块帧内预测的具体过程
- linux docker查看容器状态,Docker容器状态命令行工具——Ctop
- 转载—android 媒体库数据更新解决办法总结
- 从Nand Flash启动U-BOOT的基本原理
- windows程序设计一 最简单的windows程序
- 有限状态机 Finite State Machine(FSM)
- 苹果6怎样分屏_皮皮喵最新版下载安卓版更新 0.2.6
- 身体指数bmi流程图_理想的身体脂肪百分比是多少?男女不同脂肪数据对照表
- flv f4v mp4 视频播放器代码
- java计算机毕业设计健身房管理系统演示录像2021MyBatis+系统+LW文档+源码+调试部署
- java hevc和heif_关于 iOS 和 macOS 的 HEVC 和 HEIF
- 谷歌扩展工具下载网址---最新
- linux mysql 登录报1045_【mysql】linux登录MySQL_报错ERROR_1045_(28000)解决办法
- 命令行修改文件md5
- 初识大数据(二)医疗大数据