在这篇简短的文章中,我将解释在使用JSON传输数据时,为什么浮点数或大十进制值应表示为字符串 。

long类型引发的诡异情况

长话短说,同事在利用swagger对接后端API时,诡异的发现swaggerUI中显示的json属性值并不是api返回的值。

[HttpGet]
public IActionResult QueryAsync()
{var testJson = new{Id =  123123126964992223,Profile = "Please attention on Id",};return new JsonResult(testJson);
}

该API在swagger输出:

{"Id": 123123126964992220,"Profile": "Please attention on Id"}

进一步从Chrome->[Network]->[Preview]、[Response payload]观察到该long属性值的差异。

直接给结论:部分long类型值(最大值2^63^-1)会超过Javascript的最大安全Number(2^53^-1), 浏览器/前端 使用JSON.parse(123123126964992223)将不再保证准确性。

将JSON中的数字值作为字符串传输的是为了消除传输中的精度丢失或歧义性。

JSON规范中未给数值指定精度,JSON解析器会自由选择合适的数值精度。如果您的应用程序具有特定的精度要求,那么不同的JSON解析器可能不能正确表达精度。

另外部分long类型值(最大值263-1)会超过Javascript的最大安全Number(253 -1), 前端json反序列化时也会出现错误。

stackoverflow有个解释很赞:

覆写.NET Core序列化框架,将long转化为string

针对NewtonsoftJson编写BigIntJsonConvert

 public class BigIntJsonConverter : JsonConverter<long>{public override long ReadJson(JsonReader reader, Type objectType, [AllowNull] long existingValue, bool hasExistingValue, JsonSerializer serializer){var flag = long.TryParse(reader.Value.ToString(), out long num);return flag == true ? num : 0;}public override void WriteJson(JsonWriter writer, [AllowNull] long value, JsonSerializer serializer){writer.WriteValue(value.ToString());}}// 截取自Startup.cs ConfigureServices函数context.Services.AddMvc().AddNewtonsoftJson(options =>
{options.SerializerSettings.Converters.Add(new BigIntJsonConverter());
});
  • https://stackoverflow.com/questions/35709595/why-would-you-use-a-string-in-json-to-represent-a-decimal-number

关注我们
更多干货及潮流技术

请关注Dotnet Plus公众号

“阅读全文,体验更佳”

我们为什么推荐在Json中使用string表示Number属性值相关推荐

  1. python读取路径中字符串_python实现提取str字符串/json中多级目录下的某个值

    字符串多级目录取值: 比如说: 你response接收到的数据是这样的. 你现在只需要取到itemstring 这个字段下的值.其他的都不要! 思路就是:字符串是个json格式(或转为json格式), ...

  2. python层级抓取_python实现提取str字符串/json中多级目录下的某个值

    字符串多级目录取值: 比如说: 你response接收到的数据是这样的. 你现在只需要取到itemstring 这个字段下的值.其他的都不要! 思路就是:字符串是个json格式(或转为json格式), ...

  3. PHP抓取页面中a标签的href属性值以及a中间内容

    $str = file_get_contents($zh_cn_url); $reg1='/<a href=\"(.*?)\".*?>(.*?)<\/a>/ ...

  4. 微信小程序使用setData方法修改data中对象或数组的属性值

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站 微信小程序使用setData方法修改data中对象或数组的属性值 使用微信小程序开发时,涉及到data ...

  5. CSS中position的几个属性值

    CSS中position的几个属性值 position的四种取值 :     static:static定位就是不定位,出现在哪里就显示在哪里,这是默认取值,只有在你想覆盖以前的定义时才需要显示指定 ...

  6. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [{name ...

  7. js根据数组中对象的多个属性值进行排序

    js根据数组中对象的多个属性值进行排序 seatList.sort(function (a, b) {if (a['ordinate'] === b['ordinate']) {if (a['absc ...

  8. java数组按某个值排序_Js--使用sort根据数组中对象的某一个属性值进行排序

    现货深度学习之tensorflow原理样本 87.45元 包邮 (需用券) 去购买 > Js--使用sort根据数组中对象的某一个属性值进行排序 博客说明 文章所涉及的资料来自互联网整理和个人总 ...

  9. pom.xml文件中的dependency的scope属性值为test,但是Test sources root的文件里面不能使用

    场景: 在idea2021版本中,创建maven,在pom.xml文件中的dependency的scope属性值为test,但是Test sources root的文件里面不能使用 问题描述 在pom ...

最新文章

  1. Python培训教程之Python基础知识点梳理
  2. 资料分享:送你一本《数据结构(C#语言版)》电子书!
  3. 腾讯优图×厦大再破三项医疗AI世界纪录,提升胸部多器官分割准确度
  4. w3cschool教程 - jQuery插件总结
  5. HTTP权威指南记录 ---- HTTP概述
  6. Leetcode刷题 34.在排序数组中查找元素的第一个和最后一个位置
  7. Oracle dataguard 正常切换和应急切换
  8. AliOS Things 组件系统(uCube)
  9. Arduino的串口结束符及串口缓冲区
  10. 自定义委托,事件,参数的简单随笔
  11. 北京java培训机构收费,Java开发者必看
  12. 计算几何——poj1410,线段不规范交
  13. 计算机怎么看网络密码,怎么查看电脑网络连接密码 - 卡饭网
  14. python余弦定理_基于Python计算气弹簧选型
  15. 前端面试题(不定期更新)
  16. YOLOV5网络结构
  17. python同切圆_Python绘制同切圆和同心圆
  18. 华为云管理网络2.0,志不止于网络
  19. 想要分离歌曲内的伴奏?轻松搞定
  20. 拍好人像的六个好招数

热门文章

  1. Hbase笔记4 java操作Hbase
  2. 01背包初始化的细节问题与循环下限的改进
  3. Processing编译android的apk应用
  4. 从基础开始:Qomo OpenProject中的一些关键词
  5. 如何在Ubuntu上创建桌面快捷方式
  6. android mvvm 官方例子,详解Android的MVVM框架 - 数据绑定
  7. 微信小程序 --- 页面跳转
  8. shell中字符串操作【转】
  9. Java中数据是如何存储
  10. 安装 pptpd 服务