在开发过程中,我们对外提供的服务可以抽成两大块,一块是不变的,即我们抽象出来的请求头,一块是根据不同的接口而不同的请求体。

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对象的坑相关推荐

  1. jmeter的java请求参数设置_Jmeter中json数据参数化、断言设置

    第一步:光标定位到测试计划上,右键菜单"添加" -> Threads(users) -> 线程组,如下图 第二步: 光标定位到线程组,右键菜单选择 "添加&q ...

  2. android libbfaac.so,Android中Json数据读取与创建

    一:  Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...

  3. Asp.net中Json数据的转化,读取与应用

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,而且它是基于JavaScript 的. JSON采用完全独立 ...

  4. js html 处理json数据,JS中Json数据的处理和解析JSON数据的方法详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  5. IOS中JSON数据的解析

    IOS中JSON数据解析 官方为我们提供的解析JSON数据的类是NSJSONSerialization,首先我们先来看下这个类的几个方法: + (BOOL)isValidJSONObject:(id) ...

  6. java代码转置sql数据_SQL Server中的数据科学:数据分析和转换–使用SQL透视和转置

    java代码转置sql数据 In data science, understanding and preparing data is critical, such as the use of the ...

  7. java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js

    [Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js 0 2015-11-30 20:00:06 IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,u ...

  8. java实现读取excel表格中的数据,兼容xls和xlsx

    前言 利用 java 实现读取 excel 表格中的数据,兼容 xls 与 xlsx 格式,不用额外做区分,写不同的实现方法. 引入的依赖包 <dependency><groupId ...

  9. 表格中json数据展示

    表格中json数据展示 表格中有的列后端返回的是json格式,可以用 el-popover 来展示 <template slot-scope="scope"><e ...

  10. SpringMVC响应的方式,无数据跳转页面,带数据跳转页面.Json数据返回

    SpringMVC响应的方式,无数据跳转页面,带数据跳转页面.Json数据返回 页面跳转设定 //转发会把后端携带的request和Response发送到前端jsp,在jsp中可以直接使用其中的数据/ ...

最新文章

  1. 颠覆认知——Redis会遇到的15个「坑」,你踩过几个?
  2. 【引用】Linux常用的日志文件解说及常用系统命令
  3. BZOJ-3110-K大数查询-ZJOI2013-整体二分
  4. 小程序----面试题总结
  5. Linux 的命令终端(CMD)的快捷键(Keyboard of MacBook)
  6. 宏块帧内预测的具体过程
  7. linux docker查看容器状态,Docker容器状态命令行工具——Ctop
  8. 转载—android 媒体库数据更新解决办法总结
  9. 从Nand Flash启动U-BOOT的基本原理
  10. windows程序设计一 最简单的windows程序
  11. 有限状态机 Finite State Machine(FSM)
  12. 苹果6怎样分屏_皮皮喵最新版下载安卓版更新 0.2.6
  13. 身体指数bmi流程图_理想的身体脂肪百分比是多少?男女不同脂肪数据对照表
  14. flv f4v mp4 视频播放器代码
  15. java计算机毕业设计健身房管理系统演示录像2021MyBatis+系统+LW文档+源码+调试部署
  16. java hevc和heif_关于 iOS 和 macOS 的 HEVC 和 HEIF
  17. 谷歌扩展工具下载网址---最新
  18. linux mysql 登录报1045_【mysql】linux登录MySQL_报错ERROR_1045_(28000)解决办法
  19. 命令行修改文件md5
  20. 初识大数据(二)医疗大数据

热门文章

  1. 多个excel表合并成一个excel表
  2. css样式怎么插入背景图片,css样式怎么插入背景图片?
  3. 【项目】区块链在电商领域中的应用-草莓糖(CMT)(一)
  4. 介绍 Jersey 依赖
  5. matlab主成分分析散点图_主成分分析与matlab
  6. 如何开启和关闭 win10卓越模式?
  7. numpy转str python_python-numpy数组上的str()方法并返回
  8. 神奇的量子世界——量子纠缠(Matlab实现)
  9. 《分布式服务架构》读后感
  10. 我国CN域名一年减少600万个 全要求实名注册