【C#】序列化和反序列化,以及System.Text.Json和Newtonsoft.Json比较

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
序列化和反序列化,在实际项目开发过程中用的最多。特别是有对接接口的小伙伴就深有体会。本篇文章就简单聊聊这个知识点。

在这里插入图片描述

目录

  • 一、基本概念
    • 1.1、序列化
    • 1.2反序列化
    • 1.3、举例
  • 二、特点优势
    • 2.1、System.Text.Json
    • 2.2、Newtonsoft.Json
    • 2.3、共同点
  • 三、自定义
    • 3.1、转换器
    • 3.2、JsonElement

一、基本概念

1.1、序列化

在编程中,序列化是指将对象转换为可存储或传输的格式,例如将对象转换为 JSON 字符串或字节流。
在这里插入图片描述

1.2反序列化

在编程中,反序列化则是将存储或传输的数据转换回对象的过程。在这里插入图片描述

1.3、举例

序列化和反序列化经常用于数据的持久化、数据交换以及与外部系统的通信。
它们可以使对象在不同的环境中进行传输和重用。
在 C# 中,你可以使用不同的库来实现序列化和反序列化
1)System.Text.Json
这是 .NET Core 3.0 引入的官方 JSON 库。它提供了简单而高效的 API,使得将对象序列化为 JSON 字符串或将 JSON 字符串反序列化为对象非常容易。

using System.Text.Json;// 将对象序列化为 JSON 字符串
string jsonString = JsonSerializer.Serialize(obj);// 将 JSON 字符串反序列化为对象
var obj = JsonSerializer.Deserialize<ClassName>(jsonString);

2)Newtonsoft.Json
也称为 Json.NET,是一个流行且功能强大的第三方 JSON 库。它提供了更高级的功能,如自定义转换器、null 值处理、循环引用等等。

using Newtonsoft.Json;// 将对象序列化为 JSON 字符串
string jsonString = JsonConvert.SerializeObject(obj);// 将 JSON 字符串反序列化为对象
var obj = JsonConvert.DeserializeObject<ClassName>(jsonString);

这里的 obj 是要进行序列化或反序列化的对象,ClassName 是对象的类名。

无论使用哪个库,都可以根据具体的需求选择适合的库来进行序列化和反序列化操作。它们都提供了方便的 API,使得处理 JSON 数据变得简单快捷。

二、特点优势

2.1、System.Text.Json

System.Text.Json 相比于 Newtonsoft.Json,具有以下优势和特点
1)性能
System.Text.Json 在性能方面进行了优化,通常比 Newtonsoft.Json 更快。它利用了新的读写 API,采用更高效的内部实现,以提供更好的性能和内存利用率。
2)属于 .NET Core
System.Text.Json 是 .NET Core 的一部分,因此在创建跨平台应用程序时,不需要额外的依赖项。这使得在 .NET Core 平台上使用它更加方便。
3)简单场景
System.Text.Json 提供了一些简化的 API,使得在处理简单的 JSON 数据时更容易操作。
例如,可以直接通过
JsonSerializer.Deserialize() 方法进行快速的反序列化,而无需像在 Newtonsoft.Json 中那样使用 JsonConvert.DeserializeObject()。
4)默认是强类型转换,比如:实体类定义的是字符串,json字符串返回的是整型,转换时会报错

2.2、Newtonsoft.Json

Newtonsoft.Json 相比于 System.Text.Json,具有以下优势和特点
1)使用广泛
多年来已经存在并广泛使用,Newtonsoft.Json 是一个成熟的第三方库,在 .NET 社区中被广泛接受和使用。它拥有丰富的功能和强大的灵活性,已经在许多项目中得到验证。
2)功能丰富
更丰富的功能,Newtonsoft.Json 提供了一些更高级的功能,如完全自定义的序列化和反序列化逻辑,包括对循环引用的处理、自定义转换器、忽略属性等等。它可以方便地处理一些复杂的 JSON 数据场景。
3)支持若类型转换的特点

2.3、共同点

虽然 System.Text.Json 和 Newtonsoft.Json 之间有一些区别,但它们也有一些共同点
1)序列化和反序列化
两个库都提供了用于将对象序列化为 JSON 字符串或将 JSON 字符串反序列化为对象的功能。
2)支持类型转换
无论是 System.Text.Json 还是 Newtonsoft.Json 都提供了灵活的类型转换机制,可以处理不同的数据类型之间的转换。
3)可定制性
两个库都允许你通过自定义转换器、自定义属性特性等方式来定制序列化和反序列化的行为。

三、自定义

3.1、转换器

在 .NET Core 6.0 中,默认情况下,System.Text.Json 是进行强类型转换的。
然而,你可以通过自定义转换器来实现弱类型转换,以将 JSON 字段的整型值转换为实体类的字符串属性。
首先,你需要定义一个自定义的转换器,实现将整型值转换为字符串的逻辑。

using System;
using System.Text.Json;
using System.Text.Json.Serialization;public class IntToStringConverter : JsonConverter<string>
{public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){if (reader.TokenType == JsonTokenType.Number){return reader.GetInt32().ToString();}return reader.GetString();}public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options){writer.WriteStringValue(value);}
}

然后,在你的实体类的属性上使用 [JsonConverter] 特性,将自定义转换器应用于属性。

public class MyEntity
{[JsonConverter(typeof(IntToStringConverter))]public string MyProperty { get; set; }
}

现在,当使用 System.Text.Json 进行反序列化时,整型字段将被自动转换为字符串类型。

string json = "{\"MyProperty\": 123}";
MyEntity entity = JsonSerializer.Deserialize<MyEntity>(json);
Console.WriteLine(entity.MyProperty);  // 输出 "123"

温馨提示,这只会影响转换过程,而不会改变实体类的定义和属性类型。

3.2、JsonElement

System.Text.Json 还提供了另一个选项来实现弱类型转换,即使用 JsonElement 类型。
通过将 JSON 字符串解析为 JsonElement,你可以直接从中获取任何类型的值,而无需指定具体的类型。

例如,如果你的 JSON 对象中有一个名为 "age" 的整型属性,你可以将其转换为字符串类型,

  • 如下所示
using System.Text.Json;
using System.Text.Json.Serialization;public class MyEntity
{[JsonIgnore]public int Age { get; set; }[JsonPropertyName("age")]public JsonElement AgeElement { get; set; }[JsonIgnore]public string AgeAsString => AgeElement.GetString();
}

在上面的示例中,Age 属性被标记为 [JsonIgnore],这意味着它不会被反序列化过程使用。
相反,使用 [JsonPropertyName] 特性来指定 JSON 中的属性名,并将其映射到 AgeElement 属性上。
最后,你可以通过调用 GetString() 方法从 JsonElement 中获取字符串类型的值,将其存储在 AgeAsString 属性中。

这种弱类型转换的方法更为灵活,并且避免了手动实现转换器的繁琐代码。

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

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

相关文章

AI 赋能 | 智能制造的 AI 算法开发和工程实现

谈到智能制造、智慧工厂&#xff0c;愿景是美好的&#xff0c;借助计算机视觉技术和 AI 算法&#xff0c;为自动化生产线赋予环境感知的能力&#xff0c;从而改善工艺流程&#xff0c;提高生产效率。但是&#xff0c;随着柔性化生产的需求增长&#xff0c;产线的布局调整和功能…

Docker三 | 数据卷

目录 Docker数据卷简介 添加数据卷的命令 容器数据卷的继承 Docker数据卷简介 Docker容器产生的数据&#xff0c;如果不备份&#xff0c;当容器实例删除后&#xff0c;容器中的数据也会消失&#xff0c;为了保存数据可以在Docker中使用数据卷。Docker数据卷是宿主机的一个可以…

vue3中子组件调用父组件的方法

<script lang"ts" setup>前提 父组件&#xff1a; 子组件&#xff1a; const emit defineEmits([closeson]) 在子组件的方法中使用&#xff1a; emit(closeson)

EP15:动态内存管理概述(c语言)malloc,calloc,realloc函数的介绍使用及柔性数组的介绍

如果学习方向是c方向那么c语言有三个板块的知识是非常重要的. 1:指针 2:结构体 3;动态内存管理. 序言:在c语言中,什么是动态内存 C语言中的动态内存是指在程序运行时&#xff0c;根据需要动态地分配内存空间的一种内存管理方式。与静态内存相比&#xff0c;动态内存的大小和生…

12.ROS导航模块:gmapping、AMCL、map_server、move_base案例

目录 1 导航概述 2 导航简介 2.1 导航模块简介 1.全局地图 2.自身定位 3.路径规划 4.运动控制 5.环境感知 2.2 导航坐标系odom、map 1.简介 2.特点 3.坐标系变换 2.3 导航条件说明 1.硬件 2.软件 3 导航实现 3.1 创建本篇博客的功能包 3.2 建图--gmapping 3.…

JavaScript基础知识整理(最全知识点, 精简版,0基础版)

文章目录 一、输入和输出内容 1.1 输出 1.1.1 在浏览器的控制台输出打印 1.1.2 直接在浏览器的页面上输出内容 1.1.3 页面弹出警告对话框 1.2 输入 二、变量 2.1 变量是什么 2.2 变量的声明和赋值 2.3 变量的命名规范和规范 三、变量扩展&#xff08;数组&#xff09; 3.1 数组…

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断

文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时&#xff0c;可以查看SQL语句执行信息&#xff0c;便…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑垃圾处理与调峰需求的可持续化城市多能源系统规划》

这个标题涵盖了城市多能源系统规划中的两个重要方面&#xff1a;垃圾处理和调峰需求&#xff0c;并强调了规划的可持续性。 考虑垃圾处理&#xff1a; 含义&#xff1a; 垃圾处理指的是城市废弃物的管理和处置。这可能涉及到废物分类、回收利用、焚烧或填埋等方法。重要性&…

【开源】基于Vue+SpringBoot的河南软件客服系统

文末获取源码&#xff0c;项目编号&#xff1a; S 067 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S067。} 文末获取源码&#xff0c;项目编号&#xff1a;S067。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、…

搞懂内存函数

引言 本文介绍memcpy的使用和模拟实现、memmove的使用和模拟实现、memcmp使用、memset使用 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 memcpy memcpy的使用 memcpy的…

JS加密/解密之HOOK实战2

上一篇文章介绍了HOOK常规的应用场景&#xff0c;这篇我们讲一下HOOK其他原生函数。又是一个新的其他思路 很多时候&#xff0c;当我们想要某些网站的请求参数的时候&#xff0c;因为某些加密导致了获取起来很复杂。 这时候hook就十分方便了 源代码 var _JSON_Parse JSON.…

Vue:Vue的开发者工具不显示Vue实例中的data数据

一、情况描述 代码&#xff1a; 页面&#xff1a; 可以看到&#xff0c;input获取到了data数据&#xff0c;但是&#xff0c;vue-devtool没有获取到data数据 二、解决办法 解决办法1&#xff1a; data.name的值不能全是中文&#xff0c;比如改成aa尚硅谷 解决办法2&…

LeetCode 1457. 二叉树中的伪回文路径||位运算 DFS

1457. 二叉树中的伪回文路径 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的…

力扣(LeetCode)-1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

【交流】PHP生成唯一邀请码

目录 前言&#xff1a; 1.随机生成&#xff0c;核对user表是否已存在 代码&#xff1a; 解析&#xff1a; 缺点&#xff1a; 2.建表建库&#xff0c;每次从表中随机抽取一条&#xff0c;用完时扩充 表结构 表视图 代码 解析 缺点 结论&#xff1a; 前言&#xff1a; …

解读Stable Video Diffusion:详细解读视频生成任务中的数据清理技术

Diffusion Models视频生成-博客汇总 前言:Stable Video Diffusion已经开源一周多了,技术报告《Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets》对数据清洗的部分描述非常详细,虽然没有开源源代码,但是博主正在尝试复现其中的操作。这篇…

医学影像PACS信息化数字平台源码

PACS系统对医院影像科意义重大&#xff0c;将业务量巨大的影像检验流程依托于信息化技术&#xff0c;对于进行信息化建设的医院而言&#xff0c;是十分必要的。 PACS系统源码&#xff0c;集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三…

包装类, 泛型---java

目录 一. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 二. 泛型 2.1什么是泛型 2.2泛型的引入 2.3 泛型类语法 2.4 泛型类的使用 2.5 裸类型(Raw Type)(了解) 2.6 泛型是如何编译的 2.7 泛型的上界 2.8 泛型方法 一. 包装类 在 Java 中&#xff0c;由于基本…

uniapp实战 —— 竖排多级分类展示

效果预览 完整范例代码 页面 src\pages\category\category.vue <script setup lang"ts"> import { getCategoryTopAPI } from /apis/category import type { CategoryTopItem } from /types/category import { onLoad } from dcloudio/uni-app import { compu…

Nacos 配置加密功能也太鸡肋了吧,有种更好的方式

大家好&#xff0c;我是风筝&#xff0c;微信搜「古时的风筝」&#xff0c;更多干货 当项目中用了 Nacos 做配置中心&#xff0c;是不是所有的配置都放到里面呢&#xff0c;大部分时候为了省事和统一&#xff0c;系统所有的配置都直接放在里面了&#xff0c;有时候&#xff0c…