当前位置:首页 > C# > 正文

C#中JSON序列化与反序列化详解(类型转换完全指南)

在现代C#开发中,JSON序列化是处理数据交换的核心技能之一。无论是调用Web API、存储配置文件,还是前后端通信,几乎都离不开将对象转换为JSON字符串(序列化)或将JSON字符串还原为对象(反序列化)。然而,在实际开发过程中,开发者常常会遇到类型转换的问题,比如日期格式不一致、数字类型丢失精度、自定义对象无法正确映射等。

本文将从零开始,手把手教你如何在C#中高效、安全地进行JSON序列化与反序列化,并重点讲解常见类型转换问题的解决方案。无论你是刚入门的新手,还是有一定经验的开发者,都能从中受益。

C#中JSON序列化与反序列化详解(类型转换完全指南) C# JSON序列化  类型转换 Newtonsoft.Json System.Text.Json 第1张

一、什么是JSON序列化?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。在C#中,JSON序列化就是将一个.NET对象(如类实例、列表、字典等)转换成JSON格式的字符串;而反序列化则是将JSON字符串还原回对应的.NET对象。

二、C#中常用的JSON库

目前C#生态中有两个主流的JSON处理库:

  • System.Text.Json:.NET Core 3.0+ 内置的高性能JSON库,微软官方推荐。
  • Newtonsoft.Json(又称 Json.NET):功能强大、社区广泛使用的第三方库,兼容性极佳。

下面我们将分别介绍这两个库的基本用法和类型转换技巧。

三、使用 System.Text.Json 进行序列化与反序列化

首先,确保你的项目基于 .NET Core 3.0 或更高版本。以下是一个基本示例:

using System;using System.Text.Json;public class Person{    public string Name { get; set; }    public int Age { get; set; }    public DateTime BirthDate { get; set; }}// 序列化var person = new Person {     Name = "张三",     Age = 30,     BirthDate = new DateTime(1994, 5, 20) };string json = JsonSerializer.Serialize(person);Console.WriteLine(json);// 反序列化Person deserialized = JsonSerializer.Deserialize<Person>(json);Console.WriteLine($"姓名: {deserialized.Name}, 年龄: {deserialized.Age}");

注意:默认情况下,System.Text.Json 对日期格式使用 ISO 8601 标准(如 "1994-05-20T00:00:00"),如果你需要自定义格式(如中文习惯的 yyyy-MM-dd),可以通过 JsonSerializerOptions 配置:

var options = new JsonSerializerOptions{    WriteIndented = true,    PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 转为小驼峰命名};// 自定义日期格式(需配合 Converters)options.Converters.Add(new JsonStringEnumConverter());string json = JsonSerializer.Serialize(person, options);

四、使用 Newtonsoft.Json 处理复杂类型转换

如果你的项目仍在使用 .NET Framework,或者需要更灵活的类型控制,Newtonsoft.Json 是更好的选择。首先通过 NuGet 安装:

Install-Package Newtonsoft.Json

基本用法如下:

using Newtonsoft.Json;public class Product{    public string Name { get; set; }    public decimal Price { get; set; }    public string Category { get; set; }}var product = new Product { Name = "笔记本电脑", Price = 5999.99m };// 序列化string json = JsonConvert.SerializeObject(product, Formatting.Indented);// 反序列化Product p = JsonConvert.DeserializeObject<Product>(json);

Newtonsoft.Json 支持通过特性(Attributes)精细控制序列化行为。例如:

public class User{    [JsonProperty("user_name")]    public string UserName { get; set; }    [JsonIgnore]    public string Password { get; set; } // 不参与序列化    [JsonConverter(typeof(CustomDateTimeConverter))]    public DateTime LastLogin { get; set; }}

你甚至可以编写自定义的 JsonConverter 来处理特殊类型的转换,比如将字符串 "true/false" 转为布尔值,或将 Unix 时间戳转为 DateTime

五、常见类型转换问题及解决方案

  1. 日期格式不一致:统一使用 JsonSerializerOptionsJsonConverter 控制输出格式。
  2. 数字精度丢失:避免将 decimal 转为 double,在反序列化时明确指定类型。
  3. 属性名大小写不匹配:使用 PropertyNamingPolicy(System.Text.Json)或 [JsonProperty](Newtonsoft.Json)。
  4. 多态对象反序列化失败:Newtonsoft.Json 支持 $type 字段实现多态,System.Text.Json 需要自定义转换器。

六、总结

掌握 C# JSON序列化类型转换 技术,是构建健壮、可维护应用程序的基础。对于新项目,建议优先使用 System.Text.Json;若需高级功能或兼容旧项目,则 Newtonsoft.Json 仍是可靠之选。

无论选择哪个库,理解其配置选项和扩展机制,都能帮助你轻松应对各种数据转换场景。希望本教程能为你扫清JSON处理中的障碍!

—— 学会了就去试试吧!实践是最好的老师。——