龙游网站建设的公司,建没工程信息网,装修效果图网站,做网站的业务分析给自己一个目标#xff0c;然后坚持一段时间#xff0c;总会有收获和感悟#xff01; 序列化和反序列化#xff0c;在实际项目开发过程中用的最多。特别是有对接接口的小伙伴就深有体会。本篇文章就简单聊聊这个知识点。 目录 一、基本概念1.1、序列化1.2反序列化1.3、举例… 给自己一个目标然后坚持一段时间总会有收获和感悟 序列化和反序列化在实际项目开发过程中用的最多。特别是有对接接口的小伙伴就深有体会。本篇文章就简单聊聊这个知识点。 目录 一、基本概念1.1、序列化1.2反序列化1.3、举例 二、特点优势2.1、System.Text.Json2.2、Newtonsoft.Json2.3、共同点 三、自定义3.1、转换器3.2、JsonElement 一、基本概念
1.1、序列化
在编程中序列化是指将对象转换为可存储或传输的格式例如将对象转换为 JSON 字符串或字节流。
1.2反序列化
在编程中反序列化则是将存储或传输的数据转换回对象的过程。
1.3、举例
序列化和反序列化经常用于数据的持久化、数据交换以及与外部系统的通信。 它们可以使对象在不同的环境中进行传输和重用。 在 C# 中你可以使用不同的库来实现序列化和反序列化 1System.Text.Json 这是 .NET Core 3.0 引入的官方 JSON 库。它提供了简单而高效的 API使得将对象序列化为 JSON 字符串或将 JSON 字符串反序列化为对象非常容易。
using System.Text.Json;// 将对象序列化为 JSON 字符串
string jsonString JsonSerializer.Serialize(obj);// 将 JSON 字符串反序列化为对象
var obj JsonSerializer.DeserializeClassName(jsonString);2Newtonsoft.Json 也称为 Json.NET是一个流行且功能强大的第三方 JSON 库。它提供了更高级的功能如自定义转换器、null 值处理、循环引用等等。
using Newtonsoft.Json;// 将对象序列化为 JSON 字符串
string jsonString JsonConvert.SerializeObject(obj);// 将 JSON 字符串反序列化为对象
var obj JsonConvert.DeserializeObjectClassName(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 : JsonConverterstring
{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.DeserializeMyEntity(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 属性中。 这种弱类型转换的方法更为灵活并且避免了手动实现转换器的繁琐代码。