当前位置:首页 > JAVA > 正文内容

FastJson与Jackson在处理浮点型的差异引发的思考

高老师3年前 (2023-09-19)JAVA382
最近在对接某瓜支付签名时偶尔会出现签名失败的问题,于是进行整体复盘,先看看对方的sdk中最重要的一段代码:
String data = createLinkString((JSONObject)JSONObject.toJSON(requestBody),null);
使用FastJson将任意对象转换Json再转换为Map类型传递给createLinkString函数进行md5签名,我们公司禁止使用FastJson,于是我使用的是Jackson来替代FastJson
String paramsJson = objectMapper.writeValueAsString(params);

Map paramsMap = JsonUtil.parseObject(paramsJson, Map.class);
String data = createLinkString(paramsMap, null);
看起来是不是很完美?是的,很完美,但是在处理浮点型时会有问题,举个FastJson栗子:
HashMap<String, BigDecimal> body = new HashMap<>();
body.put("price", BigDecimal.valueOf(0.10));
String json = com.alibaba.fastjson.JSON.toJSONString(body);
System.out.printf(json)
输出信息:{"price":0.1}
震惊吧,0.10输出0.1,反观JackSon一切正常,国人的东西还是太浮躁了。那么怎么解决呢,其实只需要把浮点数转换为字符串类型即可:
HashMap<String, String> body = new HashMap<>();
body.put("price", "0.10");
String json = com.alibaba.fastjson.JSON.toJSONString(body);
System.out.printf(json)
输出信息:{"price":"0.10"}
问题虽然解决了,但是依然有点震惊,一家支付公司为何设计的签名如此不通用,金额传Double,单位传元,无法理解,理解不了。。。
行业通用方案都是基于RSA进行处理,金额也是以BigInt,单位分进行处理,停止吐槽,停止吐槽,停止吐槽

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/630.html

分享给朋友:

“FastJson与Jackson在处理浮点型的差异引发的思考” 的相关文章

 java字节与字符的区别,字节与字的区别与联系

java字节与字符的区别,字节与字的区别与联系

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文...

java一个类可以有多个构造方法

java一个类可以有多个构造方法

java一个类可以有多个构造方法,根据传参类型和个数来匹配执行哪个构造方法。public class Member {     public Member(){      ...

java增强型for循环

java增强型for循环

Java5 引入了一种主要用于数组的增强型 for 循环,类似js中的for inpublic class Member {     public static void main(String[]&...

java stringBuffer,java stringBuffer反转字符串,java stringBuffer delete删除字符/移除字符,java stringBuffer在指定位置插入字符串,java stringBuffer替换指定位置的字符串,java stringBuffer获取指定索引的值

java stringBuffer,java stringBuffer反转字符串,java stringBuffer delete删除字符/移除字符,java stringBuffer在指定位置插入字符串,java stringBuffer替换指定位置的字符串,java stringBuffer获取指定索引的值

java stringBuffer(1).stringBuffer和stringBuilder区别stringBuffer是线程安全的,stringBuilder速度更快(2).简单的stringBuffer例子StringBuffer sBuffer = new&nb...

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

(1).创建数组double[] myList = new double[size];  //推荐创建方式 double myList[] = new double[size];  ...

java匹配一个字符串在另外一个字符串中出现的次数,java正则start,java正则end

java匹配一个字符串在另外一个字符串中出现的次数,java正则start,java正则end

java匹配一个字符串在另外一个字符串中出现的次数,java正则start,java正则end// 正则 String pattern = "\\bgao\\b"; // 字符串 String content ...