首页 > 其他分享 >.net 关于在program中使用AddNewtonsoftJson之后,继承于System.Text.Json.Serialization的自定义转换器JsonConverter不生效的问题

.net 关于在program中使用AddNewtonsoftJson之后,继承于System.Text.Json.Serialization的自定义转换器JsonConverter不生效的问题

时间:2023-10-11 16:34:08浏览次数:53  
标签:JsonConverter 自定义 Text System Json 转换器 AddNewtonsoftJson

  首先,先说遇见的问题与代码示例,在.net代码中注册了如下代码

 .AddNewtonsoftJson(option =>
                {
                    //使用本地时区
                    option.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
                    //日期格式
                    option.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss.fff";
                    //忽略循环引用
                    option.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                })

  该代码使用了第三方库Newtonsoft.Json,该库是比较好用的一个json序列化库。这里也是为了去对日期格式做一个全局序列化的操作。在使用了AddNewtonsoftJson之后出现了一个问题,自定义的继承了System.Text.Json.Serialization的转换器就不生效了,这里博主是按照最高优先级属性注册的,这里困扰了博主,于是开始查资料(可能是因为博主不是大佬,这种问题也能困扰,最后得出结论是使用了第三方,官方的就没用了,那么这里博主参照官方的解释,还有了新的疑惑)。

 

  下面是博主查询官方资料得到的解释,也是查了很久,虽然资料比较少,但是官方写在了一些奇怪的地方。

1.使用的了AddNewtonsoftJson,AddNewtonsoftJson 替换了基于 System.Text.Json 的默认输入和输出格式化程序,该格式化程序用于设置所有JSON 内容的格式。

出处:ASP.NET Core Web API 中的 JSON 修补程序 | Microsoft Learn

这里,官方是放在了菜单:处理JSON Patch请求的文章里面,也是找了半天才找到该描述。

 

 

2.基于第一点,NewtonsoftJson相当于代替了System.Text.Json成为了内置转换器,那么我在使用时应该遵守下面这点:仅当未注册适用自定义转换器时,才会选择内置转换器。

出处:如何编写用于 JSON 序列化的自定义转换器 - .NET | Microsoft Learn

这里官方在转换器的注册优先级有说明,会使用自定义转换器。

 3.基于第二点,我在代码中使用了继承System.Text.Json的自定义转换器,并且使用了优先级最高的属性注册,那么应该是自定义转换器优先级最高,应该生效。但是事实是并没用生效。

出处:从 Newtonsoft.Json 迁移到 System.Text.Json - .NET | Microsoft Learn

综上:目前的理解为,当没有使用AddNewtonsoftJson 时,优先级按照官方给出的,属性注册最高,是生效的。当使用了AddNewtonsoftJson 时,官方的System.Text.Json是被NewtonsoftJson默认设置了,System.Text.Json是不生效的。产生的疑惑:按照官方给出的优先级与上面第二点的说明,如果我自定义了转换器,并且按照优先级最高的属性注册,无论是否是使用了AddNewtonsoftJson,其实都应该生效的。我们应该是要遵循优先级原则的,否则的话,一旦我使用了AddNewtonsoftJson,那我就并不能使用System.Text.Json的自定义转换器了?

  这里,博主也和朋友讨论过,按照目前的测试与资料来看,当使用了第三方json序列化库,官方的text.json库就没用了,会被强制给使用第三方库,就算自定义转换器也是没有用的,自始至终会使用Newtonsoft.Json库的转换器,那这里其实是一个强制的点了。

  最后,博主其实是工作中需要使用到自定义转换器,最后还是注释掉了AddNewtonsoftJson的部分,使用了官方的json库,这样自定义转换器更灵活,虽然可能需要在更多的属性上面去加这样一个转换器,但是对于使用来说更加灵活,也更加的方便。

JSON Patch

标签:JsonConverter,自定义,Text,System,Json,转换器,AddNewtonsoftJson
From: https://www.cnblogs.com/yangruibokeyuan/p/17757552.html

相关文章

  • 【读论文】CM-Gen: A Neural Framework for Chinese Metaphor Generation with Explic
    为了更好的阅读体验,请点击这里由于发不出论文,所以找点冷门方向做一做。从汉语比喻开始。读完这篇论文之后我觉得COLING这方向我上我也行(ε=ε=ε=┏(゜ロ゜;)┛题目:CM-Gen:ANeuralFrameworkforChineseMetaphorGenerationwithExplicitContextModelling论文链接代......
  • winform-RichTextBox控件(有格式文本控件)
    RichTextBox控件用于显示、输入和操作带有格式的文本   除了执行TextBox控件的所有功能外,还可以显示字体、颜色和链接 1、在RichTextBox控件中显示滚动条  2、在RichTextBox控件中设置字体属性 3、将RichTextBox控件显示为超链接样式 4、在RichTextBox控件......
  • struts2的result type="plainText"
    1.作用:将response中的数据直接打印到当前页面指定的地方2.配置:<actionname="test"class="testAction"method="test"><resultname="success"type="plainText"><paramname="charSet&qu......
  • ServletContext接口
    第一个:ServletContext接口一个web应用创建一个,实现数据共享步骤1.需要在web.xml中配置,写在<Web-app></web-app>中间<param-name></param-name>写入变量名,<param-value></param-value>写入值<context-param><param-name>name</param-name><param-value......
  • delphi 自定义光标
    自定义光标代码使用图像的方式你可以使用两个位图(一个用于普通图像,一个用于遮罩图像)来创建图标,并将其手动加载到Cursors属性使用完自定义光标后要调用WindowsAPI函数DestroyIconconstcrMyCursor=5;procedureTForm1.Button1Click(Sender:TObject);varbmpMas......
  • abp 框架使用自定义appsetings.json
    定义一个自定义的配置文件在调试配置中设置启动环境这里的值填入刚刚设置的配置文件appsetings.{配置文件名字}.json的配置文件名字启动即可系统启动时,首先会检查{配置文件名字}是否存在,存在的话使用appsettings.{配置文件名字}.json,不存在则使用appsettings.json(默认配......
  • 一种自定义圆角按钮
    效果图: 代码:///<summary>///头像按钮///</summary>publicclassAvaButton:ButtonBase{publicstaticreadonlyDependencyPropertyCornerRadiusProperty=DependencyProperty.Register("CornerRadius",typeof(CornerRadius),t......
  • 深入理解模型视图、自定义模型
    一、深入理解模型model提供一种标准接口,供视图和委托访问数据。在Qt中,这个接口由QAbstractItemModel类进行定义。不管底层数据是如何存储的,只要是QAbstractItemModel的子类,都提供一种表格形式的层次结构。视图利用统一的转换来访问模型中的数据。但是,需要提供的是,尽管模型内部是......
  • Spring源码解析——ApplicationContext容器refresh过程
    正文在之前的博文中我们一直以BeanFactory接口以及它的默认实现类XmlBeanFactory为例进行分析,但是Spring中还提供了另一个接口ApplicationContext,用于扩展BeanFactory中现有的功能。ApplicationContext和BeanFactory两者都是用于加载Bean的,但是相比之下,ApplicationContext提供了......
  • 注解(Annotation)简介,内置注解,元注解,自定义注解
    注解:不是程序本身,可以对程序做出解释(这一点和注释没什么区别)可以被其他程序(比如编译器)读取@Functional(这是L)(这是I)Interface  函数式接口 内置注解:java本来就有的注解@Override  重写@Deprecated 已废弃,不推荐使用的意思@SuppressWarnings 镇压警告 ......