我们为什么推荐在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& ...
随机推荐
- synchronized 的实现原理
加不加 synchronized 有什么区别? synchronized 作为悲观锁,锁住了什么? synchronized 代码块怎么用 前面 3 篇文章讲了 synchronized 的同步方法和 ...
- C#多线程(15):任务基础③
目录 TaskAwaiter 延续的另一种方法 另一种创建任务的方法 实现一个支持同步和异步任务的类型 Task.FromCanceled() 如何在内部取消任务 Yield 关键字 补充知识点 任务 ...
- mysql查询添加
当表结构一样的情况下,insert into 想要插入的表 SELECT * from 查询的表; 此sql语句,适应于 1000万数据插入1000万数据中去,2000万数据的合并 .------ ...
- session开启慢的原因及解决办法
做微信开发的时候发现微信回复特别慢,发个消息要好几秒才回复,发现不正常后就赶紧找答案,到最后发现是session_start()开启很慢,这是因为session缓存文件过多,默认缓存文件在:win:w ...
- SVN部署(Centos7,Ubuntu)
SVN 简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Sub ...
- history of program atan2(y,x)和pow(x,y)
编年史 1951 – Regional Assembly Language 1952 – Autocode 1954 – IPL (LISP语言的祖先) 1955 – FLOW-MATIC (COBO ...
- 【集群实战】NFS网络文件共享服务
1. NFS介绍 1.1 什么是NFS? NFS是Network File System的缩写,中文意思是网络文件系统. 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. ...
- if __name=='__main__"的作用
1.__main__的作用 我们可以经常在不同的程序和脚本中看到有这样的代码: if __name__=='__main__':#如果在windows上启动线程池,必须要使用. func() 很多情况 ...
- 我想solo自己一个人!
区域赛之后你就该走了,现在你告诉我,没精力不打了,我真谢谢你! 今年就TM的没有一点舒心的地方! 父母分居, 队友出走, 队伍解散, 白天家里两个外甥很吵, 鼻窦炎复发, 喜欢的妹子也追不到, 整夜失 ...
- POJ Building a Space Station 最小生成树
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15664 Accepted: 6865 Description You ...