
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的标准格式之一。.NET 提供的 JsonSerializer 是处理 JSON 序列化与反序列化的核心工具,对于构建高性能、可靠的应用程序至关重要。深入理解 JsonSerializer 的工作原理和使用技巧,能够帮助开发者优化数据处理流程,提升应用的整体性能。
JsonSerializer 用于将后端的对象序列化为 JSON 字符串发送给前端,以及将前端传来的 JSON 数据反序列化为对象进行处理。JsonSerializer 进行序列化;从存储中读取数据后,再通过反序列化恢复对象。JsonSerializer 通过反射获取对象的属性信息,然后按照 JSON 格式的规则,将属性名和属性值转换为 JSON 字符串中的键值对。对于复杂对象,会递归处理其嵌套的属性。例如,对于一个包含自定义类的对象,会依次处理该类的各个属性,将其转换为 JSON 格式。JsonSerializer 解析 JSON 字符串,根据 JSON 中的键值对信息,通过反射创建对应的.NET 对象,并将 JSON 中的值赋给对象的相应属性。它会根据对象的类型信息,准确地还原对象的结构和数据。System.Text.Json.JsonSerializer.Serialize 方法为例,其实现涉及多个步骤和类。public static string Serialize<TValue>(TValue value, JsonSerializerOptions options = null)
{
using (var memoryStream = new MemoryStream())
{
SerializeCore(memoryStream, value, typeof(TValue), options);
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
}
private static void SerializeCore(Stream utf8Json, object value, Type type, JsonSerializerOptions options)
{
// 省略复杂的实现细节,主要是对对象进行序列化处理
// 涉及属性的遍历、类型判断和转换等操作
}在 Serialize 方法中,首先创建一个 MemoryStream 用于存储序列化后的字节数据。然后调用 SerializeCore 方法进行实际的序列化操作,最后将 MemoryStream 中的数据转换为 UTF - 8 编码的字符串返回。
2. 核心逻辑:SerializeCore 方法内部通过递归处理对象的属性,将其转换为 JSON 格式。对于不同的数据类型,会采用不同的处理方式。例如,对于字符串类型,直接将其作为 JSON 字符串处理;对于数值类型,按照 JSON 数值格式输出。在反序列化时,同样通过复杂的逻辑解析 JSON 字符串,创建并填充对象。
using System;
using System.Text.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var person = new Person { Name = "Alice", Age = 30 };
// 序列化
string jsonString = JsonSerializer.Serialize(person);
Console.WriteLine($"Serialized JSON: {jsonString}");
// 反序列化
Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonString);
Console.WriteLine($"Deserialized Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
}
}Person 类,包含 Name 和 Age 属性。在 Main 方法中创建 Person 对象,使用 JsonSerializer.Serialize 方法将其序列化为 JSON 字符串,然后使用 JsonSerializer.Deserialize 方法将 JSON 字符串反序列化为 Person 对象,并输出相关信息。JsonSerializerOptions 进行序列化和反序列化。using System;
using System.Collections.Generic;
using System.Text.Json;
public class Address
{
public string Street { get; set; }
public string City { get; set; }
}
public class Company
{
public string Name { get; set; }
public List<Person> Employees { get; set; }
public Address Headquarters { get; set; }
}
class Program
{
static void Main()
{
var address = new Address { Street = "123 Main St", City = "Anytown" };
var employees = new List<Person>
{
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
var company = new Company
{
Name = "Example Inc.",
Employees = employees,
Headquarters = address
};
var options = new JsonSerializerOptions
{
WriteIndented = true
};
// 序列化
string jsonString = JsonSerializer.Serialize(company, options);
Console.WriteLine($"Serialized JSON: {jsonString}");
// 反序列化
Company deserializedCompany = JsonSerializer.Deserialize<Company>(jsonString);
Console.WriteLine($"Deserialized Company Name: {deserializedCompany.Name}");
}
}Address 类、Company 类,Company 类包含 List<Person> 和 Address 类型的属性。创建相关对象并设置数据,通过 JsonSerializerOptions 设置 WriteIndented = true 使序列化后的 JSON 字符串具有缩进,方便阅读。进行序列化和反序列化操作,并输出相关信息。using System;
using System.Text.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
// 错误的 JSON 字符串,缺少 Age 属性
string jsonString = "{\"Name\":\"Eve\"}";
try
{
Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonString);
Console.WriteLine($"Deserialized Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
}
catch (JsonException ex)
{
Console.WriteLine($"Deserialization error: {ex.Message}");
}
}
}JsonSerializerOptions 的 IgnoreUnknownProperties 属性忽略未知属性。using System;
using System.Text.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
string jsonString = "{\"Name\":\"Eve\"}";
var options = new JsonSerializerOptions
{
IgnoreUnknownProperties = true
};
try
{
Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonString, options);
Console.WriteLine($"Deserialized Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
}
catch (JsonException ex)
{
Console.WriteLine($"Deserialization error: {ex.Message}");
}
}
}JsonSerializerOptions 并设置 IgnoreUnknownProperties = true,在反序列化时忽略 JSON 字符串中不存在于目标对象的属性,避免反序列化失败。.NET 的 JsonSerializer 在性能上表现出色。例如,在对包含大量属性和嵌套结构的复杂对象进行序列化和反序列化时,JsonSerializer 的速度比某些传统库快约 30%,内存占用也更低。这得益于其优化的底层实现和对反射等操作的高效处理。JsonSerializerOptions,建议缓存该选项,避免重复创建带来的性能开销。JsonSerializer 默认使用 ISO 8601 格式处理日期。如果需要自定义日期格式,可以在 JsonSerializerOptions 中设置 DateTimeFormat 属性。[JsonIgnore] 特性标记该属性,或者在 JsonSerializerOptions 中通过 ContractResolver 进行更复杂的属性筛选和处理。.NET 中的 JsonSerializer 是高效处理 JSON 数据的重要工具,其核心在于准确的对象与 JSON 格式的转换原理和优化的底层实现。适用于各种需要进行 JSON 序列化和反序列化的场景,但在处理极端复杂或超大对象时需注意性能和内存优化。随着 .NET 的不断发展,JsonSerializer 有望在性能、功能扩展性等方面进一步提升,以满足日益复杂的应用需求。