问题

Javascript 的 number 类型存在精度限制,浏览器反序列化 JSON 时,无法完整保留 long 类型的精度。

在 JSON 序列化时将 long 转换为 string 进行传递就可以保留精度。在 ASP.NET Core 中,可以创建一个 自定义 JsonConverter 来达到这一目的。

实现 longstring 转换的 JsonConverter

创建一个类 LongToStringJsonConverter,示例代码(来自:https://github.com/cnblogs/Architecture/blob/main/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/LongToStringConverter.cs)

/// <summary>
/// JSON 序列化时,在 long 和 string 类型之间转换。
/// </summary>
public class LongToStringConverter : JsonConverter<long>
{
/// <inheritdoc />
public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.String)
{
return reader.GetInt64();
} var raw = reader.GetString();
if (string.IsNullOrWhiteSpace(raw))
{
throw new JsonException("string is empty");
} var success = long.TryParse(raw, out var parsed);
if (success == false)
{
throw new JsonException("string value can't be converted to long");
} return parsed;
} /// <inheritdoc />
public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}

然后可以在应用代码里启用将刚刚写好的自定义 JsonConverter,可以根据项目的不同需求,指定启用的范围。

仅对类中的某一字段启用:

public class TestDto
{
[JsonConverter(typeof(LongToStringJsonConverter))]
public long Id { get; set; }
}

对整个 API 项目全局启用:

新的 Minimal API 项目

// Program.cs

builder.Services.ConfigureHttpJsonOptions(options => options.SerializerOptions.Converters.Add(new LongToStringJsonConverter()));

传统的 MVC 项目

builder.Services.AddControllers().AddJsonOptions(options => options.SerializerOptions.Converters.Add(new LongToStringJsonConverter()))

在前端,如果使用 Typescript 的话,需要将对应类型从 number 改为 string 以实现正确的类型推断。

interface TestDto {
// id: number;
id: string;
}

使用自定义 JsonConverter 解决 long 类型在前端的精度问题的更多相关文章

  1. 自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用

    接上篇的问题,给出我自己的解决方案. 同时推荐要学习MVC的可以参考下<ASP.NET MVC4 框架揭秘>. 首先,要自定义JSonResult,就要明白MVC中 JsonResult的 ...

  2. 解决long类型传到前端损失精度问题

    原因: 解决办法:https://blog.csdn.net/xiaoxiangzi520/article/details/76522242 经过验证,发现上述解决办法回导致前端先后台传输数据时导致j ...

  3. .NET WebAPI 自定义 NullableConverter 解决请求入参 “”空字符触发转换异常问题

    最近在项目中启用了Nullable 可为空的类型,这个特性确实很好用,在 WebAPI 的入参上可以直接采用 ? 来标记一个字段是否允许为空,但是使用过程中遇到了如下一个问题,比如创建部门接口 我们定 ...

  4. 【vuejs深入一】深入学习vue指令,自定义指令解决开发痛点

    写在前面  一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 最近博主我沉淀了几个月,或者说懒了几个月.然而大佬的指点总是一针见血,能够让人看到方向.所以我现在有觉得,一个好的 ...

  5. jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题

    jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...

  6. 深入学习vue指令,自定义指令解决开发痛点

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code v-model指令 vue.js的定义是一个mvvm框架,将它发挥到极致能够极大的提升 ...

  7. vue 解决axios请求出现前端跨域问题

    vue 解决axios请求出现前端跨域问题 最近在写纯前端的vue项目的时候,碰到了axios请求本机的资源的时候,出现了访问报404的问题.这就让我很难受.查询了资料原来是跨域的问题. 在正常开发中 ...

  8. Delphi 7使用自定义图标关联文件类型

    Delphi 7使用自定义图标关联文件类型 5.2 Delphi编程(40)  版权声明:本文为博主原创文章,未经博主允许不得转载. 在开发过程中,我们经常需要属于自己的文件类型,自定义的后缀名不仅可 ...

  9. SpringMVC返回Json,自定义Json中Date类型格式

    http://www.cnblogs.com/jsczljh/p/3654636.html —————————————————————————————————————————————————————— ...

  10. 发现 一个业务管理系统 解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 。 哈

    解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 . 哈 还有 各种 aop 组件 呢 . 大家 high 来 准备 用 fluent data  和 mysql 写一个 wcf 的 接口呢. ...

随机推荐

  1. 知乎问题:为什么很多web项目还是使用 px,而不是 rem?

    阅读过几篇关于 px rem 的文章,感觉 rem 很强大.但是自己接触到的公司项目全部都使用 px,想知道为什么.是我司技术更新落后了吗? 我们当然有在用 vw 和 vh,但是只是在 layout ...

  2. 不升级 POI 版本,如何生成符合新版标准的Excel 2007文件

    开心一刻 记得小时候,家里丢了钱,是我拿的,可爸妈却一口咬定是弟弟拿的 爸爸把弟弟打的遍体鳞伤,弟弟气愤的斜视着我 我不敢直视弟弟,目光转向爸爸说到:爸爸,你看他,好像还不服 问题描述 项目基于 PO ...

  3. ASP.NET Core – DateTime, DateTimeOffset, DateOnly, TimeOnly, TimeSpan, TimeZone, NodaTime 使用基础

    前言 心血来潮,这篇讲点基础的东西. 对日期和时区 timezone 不熟悉的读者,请先看这篇 Time Zone, Leap Year, Date Format, Epoch Time 时区, 闰年 ...

  4. CSS – W3Schools 学习笔记 (2)

    CSS Combinators Link to W3Schools body p = body 里的所有 p descendant body > p = body first child lay ...

  5. 记录一次BOOST库相关的使用包含互斥量、条件变量的类,引发的编译报错

    1. 工作中的代码: 2. 使用指针作为形参,不会造成编译报错,我是可以理解的. 那么请讨论下为什么使用值传递和引用作为形参,会造成编译报错? 3. 答案揭晓 boost 的mutex源码: 最终原因 ...

  6. union联合体的缺陷

    传统的 union 联合体在 C++ 中虽然提供了一种能够在相同的内存空间内存储多种不同类型的方式,但它也有一些显著的缺陷和限制.这些缺陷让 union 的使用不太安全,尤其是在复杂的程序中.以下是传 ...

  7. 5.7 函数y=Asin(ωx+φ)的图像和性质

    \({\color{Red}{欢迎到学科网下载资料学习 }}\) [ [高分突破系列]高一数学上学期同步知识点剖析精品讲义与分层练习] (https://www.zxxk.com/docpack/27 ...

  8. 活动预告 | 中国数据库联盟(ACDU)中国行定档深圳,一起揭秘数据库前沿技术

    在当今数字化时代,数据库是各行各业中最核心的信息管理系统之一.随着技术的飞速发展,数据库领域也不断涌现出新的前沿技术和创新应用.数据库运维和开发人员需要紧跟前沿技术,才能保持竞争力,并实现更高效.更智 ...

  9. golang中使用多线程和channel通道

    package controller import ( "context" "github.com/gogf/gf/v2/os/grpool" "sy ...

  10. Docker高阶篇(一)

    本篇章主要为工作实践过程中对高端应用的处理和把控 1.Docker复杂安装 mysql的主从复制 https://www.bilibili.com/video/BV1gr4y1U7CY?p=41&am ...