c#:System.Text.Json 的使用三(从Newtonsoft迁移)

环境:

  • .net 6.0
  • vs2022

系列篇:
《c#:System.Text.Json 的使用一》
《c#:System.Text.Json 的使用二》
《c#:System.Text.Json 的使用三(从Newtonsoft迁移)》

参考:
《MSDN: 从 Newtonsoft.Json 迁移到 System.Text.Json》

一、为什么要从Newtonsoft迁移?

  • 不想再依赖三方包,虽然 Newtonsoft 已是“业界标准“;
  • 想提升程序性能;

二、迁移中常见坑点

System.Text.Json 在提升性能的同时,也对反序列化时的json字符串进行了严格要求,而Newtonsoft则比较宽松,所以迁移后大概率会遇到json序列化问题,如下:

2.1 SystemTextJson 无法 “” => int? 无法转为null

在这里插入图片描述

严格来说,System.Text.Json 这么做并没有什么问题,但 Newtonsoft 允许啊,所以以前Api接口没问题,但换了 System.Text.Json 后就开始报错了。。。

为了兼容这种情况,我们需要自定义JsonConverter。。。(最后给出代码)

2.2 SystemTextJson 无法 123 => “123”

在这里插入图片描述

还是太严格导致的,为了兼容这种情况,我们需要自定义JsonConverter。。。(最后给出代码)

2.3 SystemTextJson 无法 true => “true”

在这里插入图片描述

还是太严格导致的,为了兼容这种情况,我们需要自定义JsonConverter。。。(最后给出代码)

2.4 SystemTextJson 无法 1 => true “true”=>true

在这里插入图片描述
还是太严格导致的,为了兼容这种情况,我们需要自定义JsonConverter。。。(最后给出代码)

2.5 SystemTextJson 无法 “NaN” => float.NaN

在这里插入图片描述
这个需要设置下就行了,但相对Newtonsoft 来说还是有点严格,但应该是没问题了。(最后给出代码)

为什么说设置后还还是有点严格呢,因为 Newtonsoft 还忽略大小写和从不带引号的string中反序列化,然后System.Text.Json 却不行,如:

//Newtonsoft还兼容了大小写
d = Newtonsoft.Json.JsonConvert.DeserializeObject<Demo6>("{\"Float\":\"nan\"}");
d.Float.ShouldBe(float.NaN);
//Newtonsoft还兼容了不带引号的 NaN =>flaot.NaN
d = Newtonsoft.Json.JsonConvert.DeserializeObject<Demo6>("{\"Float\":NaN}");
d.Float.ShouldBe(float.NaN);

2.6 SystemTextJson 无法 “Close” => EnumState

在这里插入图片描述
这一点System.Text.Json 还是很差的,虽然可以设置将枚举转换为字符串,但读取的时候并不是自动的,也还需要设置,但在Api项目中,我们期望读取时允许 string => enum ,但返回时并不一定 enum => string,所以。。。(最后给出代码)

2.7 SystemTextJson 无法 “2023-09-21 01:02:03” => DateTime

在这里插入图片描述
默认 System.Text.Json 是遵从 ISO 8601-1:2019 标准,但还是太严格了,读取的时候就不能宽松些吗,毕竟Newtonsoft支持啊。。。(最后给出代码)

2.8 System.Text.Json 无法反序列化无引号的属性

在这里插入图片描述
其实这里还好,一般都会加引号的,如果没有加,就让对方改吧,毕竟这不符合json标准而且System.Text.Json 设计时就不允许。。。

三、System.Text.Json其他的功能缺陷

3.1 不支持 JsonPath 查询

当然,如果你没用过这么"高级"的功能,则可以忽略。

3.2 不支持 将DataTable 序列化为字符串

一般不会将 DataTable 序列化为字符串,因为DataTable本身包含了太多信息,即使是Newtonsoft,序列化后的结果也包含太多无用的东西,如下图所示:

在这里插入图片描述

一般我们会将 DataTable转为list再进行序列化和反序列化。

四、还要迁移到 System.Text.Json 嘛?

我选择了迁移,因为我不想依赖其他包,而且解决了一些不能够忍受的问题后,其他的感觉还ok。
具体的代码参考:《DotNetCommon: JsonHelper》。

在应用到 asp.net core api中时,可以使用如下:

services.AddControllers().AddJsonOptions(options =>
{JsonHelper.Configure(options.JsonSerializerOptions, dateTimeFormatString: "yyyy-MM-dd HH:mm:ss", lowerCamelCase: true);
});

五、性能如何?

System.Text.Json 性能确实强悍,随便一测,将近Newtonsoft的3倍,而我为了兼容Newtonsoft的功能,增加了一些设置和自定义转换器,就这样性能还是 Newtonsoft的2倍。
测试效果如下:

在这里插入图片描述
测试代码参考:

https://gitee.com/jackletter/DotNetCommon/blob/master/tests/SystemTextJsonPerformanceTest/Program.cs

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

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

相关文章

2023/09/21 day5 qt

将注册的账号密码存储到数据库中 登录的账号密码与数据库中的账号密码进行匹配 头文件 #ifndef DENGLU_H #define DENGLU_H #include <QMainWindow> #include <QDebug> #include <QIcon> #include <QLabel> #include <QLineEdit> #include &l…

数据库——理论基础

目录 1.1 什么是数据库 1.2 数据库管理系统&#xff08;DBMS&#xff09; 1.3 数据库和文件系统的区别 1.4 数据库的发展史 1.5常见的数据库 1.5.1关系型数据库 1.5.2 非关系型数据库 1.6 DBMS支持的数据模型 1.1 什么是数据库 数据&#xff1a;描述事物的符号记录 数…

李宏毅机器学习2023作业(目录)

2023.09.20更新 作业01的一键式执行Strong Baseline完整代码已整理好&#xff0c;提取码统一设置2023 【深度解析→博文总结】李宏毅机器学习2023作业01Regression(COVID-19 Cases Prediction) 【2023作业01一键式执行Strong Baseline完整代码】 【深度解析→博文总结】李宏毅机…

【精通嵌入式Linux编程】引导加载程序详解bootloader

必须做两件事情&#xff1a; 引导加载程序必须传递一个指针&#xff0c;指向保护硬件配置信息的结构&#xff0c; 必须传递一个指向内核命令行的指针 SRAM&#xff1a;不需要内存控制器的静态随机存储器 阶段一&#xff1a;ROM代码 复位或上电后立即运行的代码必须存再soc的片…

基于springboot+vue的客户关系管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

MySQL备份与恢复

MySQL备份与恢复一、备份1、数据备份的重要性2、数据备份分类2.1 物理备份2.2 逻辑备份 3、数据库备份策略4、常用的备份方法和工具5、数据库上云迁移 二、数据库完全备份1、简介2、物理冷备份与恢复2.1 物理冷备份2.2 备份恢复2.3 补充知识date 3、mysqldump备份与恢复3.1 完全…

文件系统之程序是怎么打开文件进行操作的

本篇文章自顶向下&#xff0c;从文件系统的上层出发讲到磁盘&#xff0c;帮助理解程序是如何打开文件并进行后序的读写操作的&#xff0c;读到后面&#xff0c;前面的一些疑惑就得到解决 介绍相关概念 注意&#xff0c;目录也是文件 文件描述符 每个进程都有一个指针*files…

【深度学习】BLIP: 用于统一的视觉-语言理解和生成的引导式语言图像预训练

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP&#xff1a;用于统一的视觉-语言理解和生成的引导式语言图像预训练 论文&#xff1a;https://arxiv.org/abs/2201.12086 代码&#xff1a;https://github.…

NotePad++ 在行前/行后添加特殊字符内容方法

我们在处理数据时&#xff0c;会遇到需要在每行数据前面、后面、开头、结尾添加各种不一样的字符 如果数据不多&#xff0c;我们可以自己手动的去添加&#xff0c;但如果达到了成百上千行&#xff0c;此时再机械的手动添加是不现实的 这里教给大家如何快速的在数据每行的前后…

QT 绘画功能的时钟

.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> //信息调试类 #include <QPainter> #include <QPixmap> //图像引擎类 #include <QTime> #include <QTimer> …

秋招准备--基础知识复习--系统编程

lab1 进程 定义 进程的定义是操作系统中资源分配的基本单位&#xff0c;是程序的执行实体。具体地来分析这个定义的一体两面&#xff1a; 在资源分配方面&#xff0c;每个进程都有虚拟的进程空间&#xff0c;其中包括代码区&#xff0c;全局静态区&#xff0c;BSS区&#xff…

一文读懂 Redis 缓存系统

【摘要】本文介绍了Redis缓存原理、详细解析了缓存模型、缓存一致性和缓存异常场景。 【作者】李杰&#xff0c;专注于Java虚拟机技术、云原生技术领域的探索与研究。 尽管&#xff08;关系型&#xff09;数据库系统 (SQL) 带来了许多出色的属性&#xff0c;例如 ACID&#x…

Spring Boot Actuator使用指南

什么是 Spring Boot Actuator&#xff1f; Spring Boot Actuator 是 Spring Boot 提供的一种生产级别的特性&#xff0c;它可以帮助我们监控和管理 Spring Boot 应用&#xff0c;比如健康检查、审计、统计和 HTTP 追踪等。所有这些特性可以通过 JMX 或者 HTTP endpoints 来访问…

Linux系统编程——总结初识Linux(常用命令、特点、常见操作系统)

文章目录 UNIX操作系统&#xff08;了解&#xff09;Linux操作系统主要特征Linux和unix的区别和联系什么是操作系统常见的操作系统Ubuntu操作系统Ubuntu安装linux下的目录的类型(掌握)shell指令shell指令的格式文件操作相关指令系统相关命令网络相关命令其他命令软件安装相关的…

duilib 进阶 之 list 容器使用 及扩展

目录 一、list控件 1、选中事件的例子 2、子项目为简单容器时赋值 1)、直接样式文件里赋值

leetcode Top100(16)缺失的第一个正数

给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 * * 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 * * * 示例 1&#xff1a; * * 输入&#xff1a;nums [1,2,0] * 输出&#xff1a;3 * 示例 2&#xff1a; * * 输入…

【算法】排序——插入排序及希尔排序

目录 前言 一、排序的概念及其应用 1.1排序的概念 1.2排序的应用 1.3常见的排序算法 二、插入排序的实现 基于插入排序的优化——希尔排序&#xff08;缩小增量排序 个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 前言 这…

js for循环设置循环变量和循环体内部是两个单独作用域

参考文章 for 循环设置循环变量的那部分是一个父作用域&#xff0c;而循环体内部是一个单独的子作用域。 for (let i 0; i < 3; i) {let i abc;console.log(i); } // abc // abc // abc上面代码正确运行&#xff0c;输出了 3 次abc。这表明函数内部的变量i与循环变量i不…

多进程编程- POSIX命名信号量(named semaphore)

POSIX命名信号量是POSIX标准下的一个进程间同步原语&#xff0c;允许多个进程共享同一个信号量&#xff0c;从而实现进程间的同步和通信。这与无名信号量不同&#xff0c;无名信号量主要用于线程之间的同步&#xff0c;而不是进程之间。 命名信号量是“命名”的&#xff0c;因…

工作、生活常用免费api接口大全

手机号码归属地&#xff1a;提供三大运营商的手机号码归属地查询。全国快递物流查询&#xff1a;1.提供包括申通、顺丰、圆通、韵达、中通、汇通等600快递公司在内的快递物流单号查询。2.与官网实时同步更新。3.自动识别快递公司。IP归属地-IPv4区县级&#xff1a;根据IP地址查…