ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ObjectNode 的科学计数法问题

2021-11-08 22:32:34  阅读:246  来源: 互联网

标签:salary 浏览器 BigDecimal objectNode ObjectNode 计数法 JSON 科学


背景

项目中需要手动生成 JSON 并返回,查阅资料发现,可以直接使用 Spring Boot 绑定的 Jackson 中的 ObjectNode 实现。

代码

类似的 Controller 代码如下:

@RestController
@Slf4j
public class JacksonController {

    @GetMapping("/get/{salary}")
    public ObjectNode getSalary(@PathVariable("salary")BigDecimal salary) {
        // 手动生成 JSON
        ObjectMapper objectMapper = new ObjectMapper();
        ObjectNode objectNode = objectMapper.createObjectNode();
        objectNode.put("salary", salary.add(BigDecimal.valueOf(200)));

        return objectNode;
    }

    @PostMapping("/post")
    public ObjectNode getUser() {
        BigDecimal salary = BigDecimal.valueOf(200D);
        // 手动生成 JSON
        ObjectMapper objectMapper = new ObjectMapper();
        ObjectNode objectNode = objectMapper.createObjectNode();
        objectNode.put("salary", salary.add(BigDecimal.valueOf(200)));

        return objectNode;
    }
}

现象

项目启动后,浏览器发送 GET 请求 /get/200,返回的 salary 为 400
但是使用 Postman 发送 POST 请求 /post,返回的 salary 却是 4E+2

分析

ObjectNode 对象调用 put() 方法,设置 BigDecimal 值的时候,会调用 BigDecimalstripTrailingZeros() 方法,该方法又会调用本类的 createAndStripZerosToMatchScale() 将值转换成科学计数法:
createAndStripZerosToMatchScale

无论 GET 请求还是 POST 请求,在 return objectNode; 的时候,其 salary 都还是 4E+2,怎么显示的返回值不一样了呢。

GET 请求返回值

handleReturnValue

writeWithMessageConverters

自始至终都是 4E+2,不知道为什么浏览器显示的返回值是 400

然后我又用 Postman 发送了一下 GET 请求 /get/200,返回的确实是 4E+2

浏览器按下 F12 出现开发者工具,重新发送一次 GET 请求,很明显看到响应的确实是 4E+2
开发者工具

这说明浏览器没有问题,那么问题应该就出在浏览器插件 JSON-handle 上了,将该插件关闭,结果如下(另一款插件 JSON格式化工具 的效果):
JSON格式化工具

结论

  • 浏览器插件 JSON-handle 自动将科学计数法换算成正常数值串表示。

  • BigDecimal 对象 add() 的方法会将结果转换成科学计数法,如果想以正常数值串表示,可以再调用 toPlainString() 方法。

标签:salary,浏览器,BigDecimal,objectNode,ObjectNode,计数法,JSON,科学
来源: https://www.cnblogs.com/ageovb/p/15526532.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有