C# 中的 JSON 序列化与反序列化:使用 Newtonsoft.Json 和 System.Text.Json

QuibblerQuibbler 2025-03-30 约 10 分钟 2006 次阅读

C# 中的 JSON 序列化与反序列化:使用 Newtonsoft.Json 和 System.Text.Json

在 C# 中,JSON 序列化和反序列化是处理数据交换和持久化的常用技术。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。本文将介绍如何在 C# 中使用两种流行的库:Newtonsoft.Json 和 System.Text.Json,来实现 JSON 的序列化和反序列化。

1. 使用 Newtonsoft.Json

Newtonsoft.Json(也称为 Json.NET)是一个非常流行的 JSON 框架,提供了强大的功能和灵活性。

安装 Newtonsoft.Json

在 Visual Studio 中,可以通过 NuGet 包管理器安装 Newtonsoft.Json:bash复制
Install-Package Newtonsoft.Json

JSON 序列化

将 C# 对象转换为 JSON 字符串:csharp复制
using Newtonsoft.Json;public class Skill{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Damage { get; set; }}var mySkill = new Skill { ID = 1, Name = "Fireball", Damage = 50 };string json = JsonConvert.SerializeObject(mySkill);Console.WriteLine(json);

JSON 反序列化

将 JSON 字符串转换回 C# 对象:csharp复制
string jsonString = "{\"ID\":1,\"Name\":\"Fireball\",\"Damage\":50}";Skill deserializedSkill = JsonConvert.DeserializeObject<Skill>(jsonString);Console.WriteLine(deserializedSkill.Name);

注意事项

  • 类中的属性名称必须与 JSON 键对应,否则在默认情况下无法正确映射。
  • 可以通过数据注解来自定义序列化和反序列化的行为,比如忽略某些属性、改变键名等。


2. 使用 System.Text.Json

System.Text.Json 是 .NET Core 3.0 及更高版本中引入的高性能 JSON 库。

JSON 序列化

将 C# 对象转换为 JSON 字符串:csharp复制
using System.Text.Json;public class Person{
    public string Name { get; set; }
    public int Age { get; set; }}var person = new Person { Name = "Alice", Age = 30 };string json = JsonSerializer.Serialize(person);Console.WriteLine(json);

JSON 反序列化

将 JSON 字符串转换回 C# 对象:csharp复制
string jsonString = "{\"Name\":\"Alice\",\"Age\":30}";Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonString);Console.WriteLine(deserializedPerson.Name);

自定义序列化和反序列化

System.Text.Json 提供了强大的自定义功能。例如,可以通过 JsonSerializerOptions 来配置序列化和反序列化的行为。


3. 示例:处理复杂 JSON 数据

假设有以下 JSON 数据:JSON复制
{
  "success": true,
  "msg": "获取成功",
  "data": [
    { "id": 0, "Name": "is C#", "Number": "A-001", "Date": "2019-08-02" },
    { "id": 1, "Name": "is Golang", "Number": "A-002", "Date": "2019-08-03" }
  ]}
可以定义对应的 C# 类:csharp复制
public class Message{
    public bool success { get; set; }
    public string msg { get; set; }
    public List<Datas> data { get; set; }}public class Datas{
    public int id { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public string Date { get; set; }}
然后使用 Newtonsoft.Json 或 System.Text.Json 进行反序列化:csharp复制
string jsonString = File.ReadAllText("data.json");Message message = JsonConvert.DeserializeObject<Message>(jsonString);Console.WriteLine(message.msg);


4. 性能比较

  • Newtonsoft.Json:功能丰富,支持复杂的自定义行为,但在性能上可能不如 System.Text.Json。
  • System.Text.Json:性能优化,适合高性能场景,但自定义功能相对有限。


总结

在 C# 中,Newtonsoft.Json 和 System.Text.Json 都是处理 JSON 数据的强大工具。Newtonsoft.Json 提供了更多的功能和灵活性,适合需要复杂自定义的场景;而 System.Text.Json 则提供了更高的性能,适合高性能要求的场景。根据你的具体需求选择合适的库。

相关推荐

精选
获取系统SDK版本、判断手机ROM
Code

获取系统SDK版本、判断手机ROM

Build获取系统SDK版本Android中部分API的使用,需要在特定的SDK版本之后才能使用,因此在兼容老版本SDK的时候,经常需要判断API的版本。各种Android版本的对应关系参考《Android各版本对应的SDK版本》判断手机ROM有时候需要判断手机系统的ROM,检测ROM是MIUI、EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件(关于build.p

3.7k
精选
AndroidStudio中各种中文乱码问题
Code

AndroidStudio中各种中文乱码问题

AndroidStudio中各种中文乱码问题1、编译Java错误信息乱码在出现这个Annotation processors must be explicitly declared now...问题的时候,正好也发现AndroidStudio Build Output错误信息都乱码。经常遇到各种问题,习惯了,现在遇到的问题,都是以后的答案。 1.1、修改项目build.gradle(无效)在整个p

2.4k
AndroidStudio 报错:has no declaration in the base values folder
Code

AndroidStudio 报错:has no declaration in the base values folder

在资源文件中正常定义的值,也能编译运行。昨天还正常,今天一打开就报错。应该又是AndroidStudio自身的Bug了。原因众说纷纭,参考Stack Overflow 一篇类似的讨论。解决:File => Invalidate Caches / Restart => Invalidate and Restart.

4.4k