DateOnly和TimeOnly类型居然不能序列化!!! .Net 6下实现自定义JSON序列化

前言

.Net 6引入了DateOnly和TimeOnly结构,可以存储日期和时间。

但在实际使用时,发现一个很尴尬的问题,DateOnly和TimeOnly居然不能被序列化:

var builder = WebApplication.CreateBuilder(args);var app = builder.Build();app.MapGet("/timeonly", () => new TimeOnly(1,0,0) );
app.MapGet("/dateonly", () => new DateOnly(2021,12,01) );app.Run();

36ac059eb1fe8372afdc59039f022b73.png

那要这两类型还有何用!

解决方案

自定义转换器

为了解决这个问题,我们需要创建两个自定义转换器来处理这些类型,以TimeOnly为例:

public class TimeOnlyConverter : JsonConverter<TimeOnly>
{public override TimeOnly Read(ref Utf8JsonReader reader,Type typeToConvert, JsonSerializerOptions options){var value = reader.GetString();return TimeOnly.Parse(value!);}public override void Write(Utf8JsonWriter writer, TimeOnly value,JsonSerializerOptions options)=> writer.WriteStringValue(value.ToString("HH:mm:ss"));
}

继承JsonConverter类,并实现ReadWrite方法。

配置

现在,我们需要将自定义转换器配置到序列化选项上。

在.NET 6之前,是修改Startup.cs文件:

public void ConfigureServices(IServiceCollection services)
{services.AddControllers().AddJsonOptions(options =>options.JsonSerializerOptions.Converters.Add(new TimeOnlyConverter()));
}

但是在.NET 6中已经没有Startup.cs文件,也不用Controller了。

4986e057c3cb6fbecee2cbf574aae89a.png

查看AddJsonOptions方法的源码,发现它实际上调用的是builder.Services.Configure方法:

public static IMvcCoreBuilder AddJsonOptions(this IMvcCoreBuilder builder,Action<JsonOptions> configure)
{if (builder == null){throw new ArgumentNullException(nameof(builder));}if (configure == null){throw new ArgumentNullException(nameof(configure));}builder.Services.Configure(configure);return builder;
}

于是,我们同样使用builder.Services.Configure方法进行配置:

using Microsoft.AspNetCore.Http.Json;var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<JsonOptions>(options =>options.SerializerOptions.Converters.Add(new TimeOnlyConverter()));

运行结果正确:

0d508e94b0664a3284316dcc6808f3f2.png

结论

不清楚官方为什么默认不支持DateOnly和TimeOnly类型序列化。

如果你碰到类似本文这种情况,可以使用自定义转换器解决。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

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

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

相关文章

使用插件创建 .NET Core 应用程序

使用插件创建 .NET Core 应用程序本教程展示了如何创建自定义的 AssemblyLoadContext 来加载插件。AssemblyDependencyResolver 用于解析插件的依赖项。该教程正确地将插件依赖项与主机应用程序隔离开来。将了解如何执行以下操作&#xff1a;构建支持插件的项目。创建自定义…

支持向量机SVC

原文&#xff1a; http://ihoge.cn/2018/SVWSVC.html 支持向量机(support vector machine)是一种分类算法&#xff0c;但是也可以做回归&#xff0c;根据输入的数据不同可做不同的模型&#xff08;若输入标签为连续值则做回归&#xff0c;若输入标签为分类值则用SVC()做分类&…

Beetlex官网迁移完成

由于beetlex.io域名无法指向国内&#xff0c;使用国内的服务器很多时候有抽风情况出现&#xff0c;所以把网站迁回国内&#xff1b;新的域名也申请完成并且申请备案通过&#xff0c;现在可以通过https://beetlex-io.com来访问Beetlex的官网.接下把涉及的费用和部署情况也说一下…

SVM支持向量机绘图

原文&#xff1a; http://ihoge.cn/2018/SVM绘图.html %matplotlib inline import matplotlib.pyplot as plt import numpy as np class1 np.array([[1, 1], [1, 3], [2, 1], [1, 2], [2, 2]]) class2 np.array([[4, 4], [5, 5], [5, 4], [5, 3], [4, 5], [6, 4]]) plt.f…

python列表生成多个号码_python遍历多个列表生成列表或字典

原博文 2017-03-10 18:30 − key[a,b,c,d] value[1,2,3,4] mydictdict(zip(key,value)) print mydict 输出结果&#xff1a; {a: 1, c: 3, b: 2, d: 4} 也可以用zip同时遍历多个列表&#xff0c;生成一个多维列表 key... 相关推荐 2019-12-18 21:27 − 一.zip函数描述和使用 zi…

NCC CAP 6.0 发布 —— 新增支持 OpenTelemetry

前言今天&#xff0c;我们很高兴宣布 CAP 发布 6.0 版本正式版&#xff0c;在这个版本中&#xff0c;我们主要致力于对 OpenTelemetry 提供支持&#xff0c;以及更好的适配 .NET 6。那么&#xff0c;接下来我们具体看一下吧。总览可能有些人还不知道 CAP 是什么&#xff0c;老规…

朴素贝叶斯--文档分类

原文&#xff1a;http://ihoge.cn/2018/MultinomialNB.html 把文档转换成向量 TF-IDF是一种统计方法&#xff0c;用以评估一个词语对于一份文档的重要程度。 TF表示词频&#xff0c; 即&#xff1a;词语在一片文档中出现的次数 词语总数IDF表示一个词的逆向文档频率指数&am…

Linux I/O 模型(待修改)

2019独角兽企业重金招聘Python工程师标准>>> 最近看到“服务器并发处理能力”章节&#xff0c;被里面的“I/O模型“搞得有点头晕&#xff0c;所以这里希望通过概念的辨析和对比&#xff0c;能更好的理解Linux的 I/O模型。 同步&#xff08;synchronous&#xff09;…

git代码提交流程

从master创建任务分支1.需要先将master分支代码更新到最新然后再切新分支&#xff1b;2.新需求和hotfix需要从master切分支&#xff0c;若是在QA测试阶段或者预发布阶段的bug&#xff0c;则需要再该功能分支上进行修改&#xff1b;提交代码到自己的任务分支commit之后一定要pus…

PCA主成分分析+SVM实现人脸识别

原文地址&#xff1a; http://ihoge.cn/2018/PCASVM人脸识别.html 加载数据 这里使用的测试数据共包含40位人员照片&#xff0c;每个人10张照片。也可登陆http://www.cl.cam.ac.uk/research/dtg/attarchive/facesataglance.html 查看400张照片的缩略图。 import time impo…

龙芯发布.NET 6.0.100开发者内测版

龙芯在龙芯开源社区发布了LoongArch64-.NET-SDK-6.0.100开发者内测版的新闻 &#xff0c;龙芯.NET基于上游社区 版本 适配支持龙芯平台架构。目前支持LoongArch64架构和MIPS64架构&#xff0c;LoongArch64架构的.NET-SDK-3.1已完成&#xff0c;安装包下载地址LoongArch64-.NET …

数据挖掘的9大成熟技术和应用

http://ihoge.cn/2018/DataMining.html 数据挖掘的9大成熟技术和应用 基于数据挖掘的9大主要成熟技术以及在数据化运营中的主要应用&#xff1a; 1、决策树 2、神经网络 3、回归 4、关联规则 5、聚类 6、贝叶斯分类 7、支持向量机 8、主成分分析 9、假设检验 1 决…

LVS:三种负载均衡方式与八种均衡算法

1、什么是LVS&#xff1f; 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西&#xff0c;其实它是一种集群(Cluster)技术&#xff0c;采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率&#xff0c;将请求均衡地转移到不同的服务器上执行&#xff0…

排查 .NET开发的工厂MES系统 内存泄漏分析

一&#xff1a;背景 1. 讲故事上个月有位朋友加微信求助&#xff0c;说他的程序跑着跑着就内存爆掉了&#xff0c;寻求如何解决&#xff0c;截图如下&#xff1a;从聊天内容看&#xff0c;这位朋友压力还是蛮大的&#xff0c;话说这貌似是我分析的第三个 MES 系统了&#xff0c…

DataGirdView 常用操作

1、将数据源的某列添加到已有DataGirdView的列 例如&#xff1a;将文件夹下所有文件名添加到DataGirdView 的文件名一列&#xff0c;图片如下&#xff1a; 首先在datagridview把文件名列的DATAPROPERTYNAME设为你要显示的数据列的名字.此处我绑定的是folder.Name,所以直接在DAT…

Android之Android studio Gradle sync failed: Unknown host ‘services.gradle.org

错误描述&#xff1a; Gradle sync failed: Unknown host services.gradle.org. You may need to adjust the proxy settings in Gradle.Consult IDE log for more details (Help | Show Log)解决办法&#xff1a; 下载gradlectrlalts 然后输入gradle&#xff1b;在project-…

使用aconda3-5.1.0(Python3.6.4) 搭建pyspark远程部署

参考&#xff1a;http://ihoge.cn/2018/anacondaPyspark.html 前言 首次安装的环境搭配是这样的&#xff1a; jdk8 hadoop2.6.5 spark2.1 scala2.12.4 Anaconda3-5.1.0 一连串的报错让人惊喜无限&#xff0c;尽管反复调整配置始终无法解决。 坑了一整天后最后最终发现…

假如人类长出翅膀,会变成这种怪样子

鲁迅曾经说过&#xff1a;“不会画漫画的段子手不是好英语老师”咳咳~ 图图君就是这样一位专注知识科普的双语漫画家长按二维码带你去图图君家串串门儿想知道人类长出翅膀的怪样子吗&#xff1f;长按二维码关注回复“翅膀”寻找答案吧在这里你不仅可以大口呼吸知识还能顺便学个…