我们为什么推荐在Json中使用string表示Number属性值?
在这篇简短的文章中,我将解释在使用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类型值(最大值263-1)会超过Javascript的最大安全Number(253-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());
});
我们为什么推荐在Json中使用string表示Number属性值?的更多相关文章
- 设置实体类型中String类型的属性值为String.Empty
/// <summary> /// 将String类型的属性值设置为String.Empty /// </summary> /// <typeparam name=&qu ...
- java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题
一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...
- js sort方法根据数组中对象的某一个属性值进行排序(实用方法)
js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {nam ...
- 转:js获取json中key所对应的value值
<script type="text/javascript"> getJson('age'); function getJson(key){ var jsonObj={ ...
- 控制层解析post请求中json数据的时候,有些属性值为空
原因: 1.默认json数据解析的时候,值会赋给键的首字母是小写的封装的bean中的属性,如果没有首字母小写的属性,也不会报错.即bean中有getXXX方法时,从json到model会增加xxx属性 ...
- js中attr 与find 获取属性值,
一.attr的用法 1. attr(属性名) //获取属性的值(取得第一个匹配元素的属性值.通过这个方法可以方便地从第一个匹配元素中获取一个属性的值.如果元素没有相应属性,则返回 und ...
- android中GridView关于间距的属性值介绍
android:columnWidth 设置列的宽度.关联的方法为:setColumnWidth(int) stretchMode属性值的作用是设置GridView中的条目以什么缩放模式去填充空间 ...
- js sort方法根据数组中对象的某一个属性值进行排序
sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {name:'zopp',age:0}, {name:'gpp' ...
- href标签中target的几个属性值
没有指定<a>的target属性值时,默认是"_blank,可以参考以下代码的设置来控制<a href="#" target="_blank& ...
随机推荐
- linux 磁盘存储和文件系统
1.磁盘结构 设备文件:关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信 I/O Ports:I/O 设备地址 一切皆文件:open(),read(),write(),close() 设备类型 ...
- CountDownLatch/CyclicBarrier/Semaphore
CountDownLatch 概念 让一些线程阻塞直到另一些线程完成一系列操作才被唤醒 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程就会被阻塞.其它线程调 ...
- 必应每日图片api
https://cn.bing.com/HPImageArchive.aspx?format=xml&cc=jp&idx=0&n=1 format = 'xml' | 'j ...
- 素数&欧拉函数
素数表 const int maxN找[1,maxN)内的素数 int prime[int I]第I个素数 const int maxN=1e5+5; int prime[maxN]; bool ma ...
- Neditor 2.1.16 发布,修复缩放图片问题
开发四年只会写业务代码,分布式高并发都不会还做程序员? BUG 修复 修复缩放图片时,鼠标mouseUp后图片还是在缩放 by @ShinyHwong Demo: https://demo.ne ...
- Rancher流水线配置文档
2019独角兽企业重金招聘Python工程师标准>>> 一.概述 Rancher流水线从逻辑上可以分为两部分,即CI和CD. CI,可分化为克隆代码.代码打包.发布镜像三部分. CD ...
- php数组存在重复的相反元素,去重复
$arr1=array('a_b','c_d','b_a','d_c'); $arr2=array('a_b','c_d','b_a','d_c'); 条件: a_b==b_a:c_d==d_c: 需 ...
- mybatis源码学习(二):SQL的执行过程
从上一篇文章中,我们了解到MapperMethod将SQL的执行交给了sqlsession处理.今天我们继续往下看处理的过程. SqlSession接口除了提供获取Configuration,Mapp ...
- AngularJS学习1-基础知识
Angular并不是适合任何应用的开发,Angular考虑的是构建CRUD应用 但是目前好像也只是用到了angular的一些指令,数据绑定,mvc,http服务而已..... 以前传统的做法就是,通过 ...
- 父级元素绑定定mouseout和mouseover,移过子元素是都会触发
2019独角兽企业重金招聘Python工程师标准>>> mouseover与mouseenter 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件. 只有在鼠标 ...