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,一经查实,立即删除!

相关文章

PHP面向对象之旅:抽象类继承抽象类(转)

可以理解为对抽象类的扩展 抽象类继承另外一个抽象类时&#xff0c;不用重写其中的抽象方法。抽象类中&#xff0c;不能重写抽象父类的抽象方法。这样的用法&#xff0c;可以理解为对抽象类的扩展。 下面的例子&#xff0c;演示了一个抽象类继承自另外一个抽象类时&#xff0c;…

Scala编程指南

1.scala简介 2004年&#xff0c;martin ordersky发明&#xff0c;javac的编译器&#xff0c;后来spark,kafka应用广泛&#xff0c;twitter应用推广。它具备面向对象和函数式编程的特点。 官网&#xff1a;www.scala-lang.org,最近版本2.12.5&#xff0c;我们用的是2.10.42.环境…

win7 64位下如何安装配置mysql-5.7.4-m14-winx64(安装记录)

1. mysql-5.7.4-m14-winx64.zip下载 官方网站下载地址&#xff1a;http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.17-winx64.zip 2、解压到D:\mysql.&#xff08;路径自己指定&#xff09; 3、在D:\mysql\mysql-5.7.4-m14-winx64下新建my.ini配置文件 内容如下&am…

Android之ndk之gdb调试

https://code.google.com/p/android/issues/detail?id152832

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

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

支持向量机SVC

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

Shell 控制并发

方法1: #!/bin/bash c0 for i in seq -w 18 31;dowhile [ $c -ge 3 ];doc$(jobs -p |wc -w)sleep 1sdonebash run_cal_us_tmp.sh 201407$i &#echo "sleep 5shaha" &c$(jobs -p |wc -w) done优点&#xff1a;实现简单 缺点&#xff1a;若sleep 时间较短&…

Android之严苛模式(StrictMode)

Android 2.3提供一个称为严苛模式&#xff08;StrictMode&#xff09;的调试特性&#xff0c;Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢&#xff1f;它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例&#xff08;policy violation&a…

Shell 脚本——测试命令

********************************************一、测试命令简介二、测试结构三、整数比较运算符四、字符串运算符五、文件操作符六、逻辑运算符********************************************一、测试命令简介Shell中存在一组测试命令&#xff0c;该组测试命令用于测试某种条件…

如何通过 C# 将文本变为声音 ?

咨询区 user2110292我的项目有一个需求需要将可以将 文本 转化为 声音&#xff0c;请问大家是否有开源的 C# 库 来解决这件事情&#xff1f;回答区 HABJAN最近 Google 发布了一个开源的 Google Cloud Text To Speech 包&#xff0c;.NET版本的github链接&#xff1a;https://gi…

sklearn集合算法预测泰坦尼克号幸存者

原文&#xff1a; http://ihoge.cn/2018/sklearn-ensemble.html 随机森林分类预测泰坦尼尼克号幸存者 import pandas as pd import numpy as npdef read_dataset(fname):data pd.read_csv(fname, index_col0)data.drop([Name, Ticket, Cabin], axis1, inplaceTrue)lables …

Oracle数据库案例整理-Oracle系统执行时故障-Shared Pool内存不足导致数据库响应缓慢...

1.1 现象描写叙述 数据库节点响应缓慢&#xff0c;部分用户业务受到影响。 查看数据库告警日志&#xff0c;開始显示ORA-07445错误&#xff0c;然后是大量的ORA-04031错误和ORA-00600错误。 检查数据库日志&#xff0c;数据库仍处于活动状态的信息例如以下&#xff1a; S…

C#读写txt文件的两种方法介绍

1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取&#xff0c;并将它转换成char数组&#xff0c;然后输出。 byte[] byData new byte[100];char[] charData new char[1000];public void Read(){try{FileStream file new FileStream…

Beetlex官网迁移完成

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

linux之tail 命令

tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容. 1&#xff0e;命令格式; tail[必要参数][选择参数][文件] 2&#xff0e;…

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…

Hibernate学习——建立一个简单的Hibernate项目

最近老师让做个web小应用&#xff0c;大三的时候学习过一点J2EE的东西&#xff0c;也做过一些web相关的XXX管理系统&#xff0c;都是用servlet&#xff0c;jsp这些完成的&#xff0c;虽然勉强能够完成任务&#xff0c;但其中各种代码掺杂在一起&#xff0c;不好看而且维护起来也…

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…

Cisco 胖AP和瘦AP的区别

无线接入点&#xff08;AP&#xff0c;Access Point&#xff09;也称无线网桥、无线网关&#xff0c;也就是所谓的“瘦”AP。此无线设备的传输机制相当于有线网络中的集线器&#xff0c;在无线局域网中不停地接收和传送数据&#xff1b;任 何一台装有无线网卡的PC均可通过AP来…

linux之head命令

head 与 tail 就像它的名字一样的浅显易懂&#xff0c;它是用来显示开头或结尾某个数量的文字区块&#xff0c;head 用来显示档案的开头至标准输出中&#xff0c;而 tail 想当然尔就是看档案的结尾。 1&#xff0e;命令格式&#xff1a; head [参数]... [文件]... 2&#xf…