使用自定义 JsonConverter 解决 long 类型在前端的精度问题

news/2024/12/4 12:28:21/文章来源:https://www.cnblogs.com/ikesnowy/p/18586013

问题

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.csbuilder.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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846620.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『玩转Streamlit』--表单Form

在Streamlit中,Form组件是一种特殊的UI元素,允许用户输入数据而不立即触发应用的重新运行。 这对于创建需要用户输入多个参数后再进行处理的交互式表单非常有用。 1. 概要 Form组件的主要作用是在一个表单内集中处理多个用户输入,使得数据收集和验证更加高效和直观。 通过Fo…

netboot ipxe 源码

来自: https://www.egg0.com/show/19831.html最近,正在学习 iPXE 源码,于是开始各种 Google 查找 iPXE 的资料进行学习。以下就是学习过程中一些感觉比较重要的点,特此记录,以备后续查阅。 起源上世纪 90 年代初,网卡开始在其扩展卡上包含启动 ROM,每个扩展卡都遵循自己…

Expert电子实验室--嵌入式多功能调试器Exlink硬件分析

哈哈,容我介绍一下,如果大家对电子感兴趣,可以看一下下面的图片,会经常更新优秀的原创文章。再次感谢每一个努力的电子爱好者。1 前言 开源链接:Exlink最好用的嵌入式多功能调试器 大家好呀,在浏览网站的时候,突然看到这样的一个作品,瞬间眼前一亮。这个项目是Expert电…

docker安装SqlServer2019

使用docker compose部署 资源清单文件 services:sqlserver-2019:restart: alwayscontainer_name: sqlserverimage: mcr.microsoft.com/mssql/server:2019-latestuser: root#端口映射ports:- 1433:1433volumes:- ./mssql:/var/opt/mssql#环境变量environment:- ACCEPT_EULA=Y#SA…

独立按键的扫描

独立按键的扫描电路原理分析 按键部分[以使用K9\K10\K11\K12为例]首先,将 KeyOut3 置 0 ,其他三条分路[KeyOut1、KeyOut2、KeyOut4]置1,此时, KeyOut3 分路的按键 K9\K10\K11\K12 作为 4 个独立按键处理 将此 4 个按键的状态直接送给小灯,即可控制小灯的亮灭: 按下 K9 ,此…

diffusion model 理论基础

Diffusion Model理论基础 基于最大似然的生成模型,给定一个数据集\(x_{D}\),训练使得模型最大化似然估计\(p_{\phi}(x_{D})\)模型希望学习得到关于x的概率分布,然后可以通过采样的方式生成想要的图片

LLM大模型: CV领域常见attention思路变种及其作用(二)

attention机制的效果非凡,但本身也是有缺陷的:Q*K矩阵的复杂度高达O(n^2);如果用在CV领域,还涉及到如下问题:局部性、全局性 稀疏性 多尺度问题   为了更好地把attention机制应用于CV,上述的几个问题是需要解决的!1、DilateFormer: Multi-Scale DilatedTransformer fo…

哈哈,我好像知道 Cursor 为什么叫 Cursor 了,真相竟然是。。。

最近 Cursor 太火了,到处都是 Cursor 的文章和视频。它就像一个能实时查看你代码的编程高手,可以提供建议,捕捉错误,还可以帮你重构代码。 你不用写一行代码,只需要动动嘴,它就能一顿操作猛如虎给你写一个官网、一个 Chrome 插件、一个卡密系统、一个。。。按这速度发展下…

QEMU中虚拟Linux网络配置

QEMU中虚拟Linux网络配置 baidu: 只有在ping的时候才想起我,对吗 初 刚才使用qemu测试驱动的时候,忽然发现ssh不能顺利的接入到虚拟操作系统之中,原以为是物理机资源紧张导致qemu启动变慢,结果摸鱼半天之后依然无法通过ssh访问。使用vnc接入后发现虚拟机无法上网,没有被分…

精橙FPGA,一个承接FPGA代码设计的资深工程师团队。

一、我们是谁 精橙FPGA,一个承接FPGA代码设计的资深工程师团队。 二、服务内容 面向在校学生、职场工程师等人员,提供FPGA入门指导和FPGA代码设计外包服务。 三、业务范围 主要提供Xilinx/Altera以及国产FPGA的入门指导和FPGA代码设计外包服务,包括但不限于以下内容: 3.1 F…

Vue项目访问路径加统一前缀(若依)

如果多个项目要发布至同一个域名下,或Vue项目要加项目名访问时,则可以通过域名后加统一前缀来区分及路由至指定的服务,例如同一域名下:站点A:https://www.abc.com站点B:https://www.abc.com/bbb站点B-接口API:https://www.abc.com/bbb/api Vue项目访问路径加统一前缀步骤…

ERP术语 中日英对照表

<table><tr><td>客户</td><td>Customer</td><td>得意先</td></tr><tr><td>供应商</td><td>Supplier</td><td>仕入先</td></tr><tr><td>仓库</td>&l…