C# 对象如何转换为 JSON:全面指南
在 .NET 开发中,将 C# 对象转换为 JSON(JavaScript Object Notation)是一项常见需求,尤其是在 Web API 开发、前后端数据交互、配置文件处理等场景中,JSON 以其轻量级、易读、跨语言兼容的特性,成为数据交换的主流格式,本文将详细介绍 C# 中将对象转换为 JSON 的多种方法,包括内置序列化机制、第三方库的使用,以及常见问题的解决方案。
什么是 JSON 序列化?
JSON 序列化(Serialization)是指将 C# 对象(如类、结构体、集合等)转换为 JSON 格式字符串的过程,反之,从 JSON 字符串还原为 C# 对象的过程称为反序列化(Deserialization),序列化的核心是将对象的公共属性和字段映射为 JSON 的键值对,其中对象属性名对应 JSON 的键,属性值对应 JSON 的值(支持基本数据类型、数组、嵌套对象等)。
使用 .NET 内置序列化器:System.Text.Json
.NET Core 3.0 及更高版本提供了内置的 System.Text.Json 命名空间,这是微软官方推荐的高性能 JSON 序列化库,无需安装额外 NuGet 包(.NET Framework 需通过 NuGet 安装)。
基本用法:JsonSerializer
System.Text.Json.JsonSerializer 是核心序列化类,通过静态方法 Serialize() 将对象转为 JSON 字符串。
示例:简单对象序列化
假设有一个 C# 模型类 User:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies { get; set; }
}
序列化代码:
using System.Text.Json;
var user = new User
{
Id = 1,
Name = "张三",
Age = 25,
Hobbies = new List<string> { "阅读", "编程", "旅行" }
};
// 序列化为 JSON 字符串(默认格式)
string jsonString = JsonSerializer.Serialize(user);
Console.WriteLine(jsonString);
输出结果:
{"Id":1,"Name":"张三","Age":25,"Hobbies":["阅读","编程","旅行"]}
自定义序列化行为
System.Text.Json 提供了丰富的配置选项,通过 JsonSerializerOptions 类控制序列化格式:
(1)格式化输出(缩进)
var options = new JsonSerializerOptions
{
WriteIndented = true // 启用缩进,美化输出
};
string formattedJson = JsonSerializer.Serialize(user, options);
Console.WriteLine(formattedJson);
输出结果:
{
"Id": 1,
"Name": "张三",
"Age": 25,
"Hobbies": [
"阅读",
"编程",
"旅行"
]
}
(2)属性命名策略(驼峰命名/大写命名)
默认情况下,C# 属性名(如 UserName)会直接转为 JSON 键("UserName"),若需转为驼峰命名("userName"),可配置 PropertyNamingPolicy:
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 驼峰命名
};
string camelCaseJson = JsonSerializer.Serialize(user, options);
Console.WriteLine(camelCaseJson);
输出结果:
{"id":1,"name":"张三","age":25,"hobbies":["阅读","编程","旅行"]}
(3)忽略空值或只读属性
默认情况下,所有可写属性都会被序列化,若需忽略 null 值或只读属性:
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, // 忽略 null 值
IgnoreReadOnlyProperties = true // 忽略只读属性
};
(4)自定义属性映射
通过 [JsonPropertyName] 特性指定 JSON 键名:
public class User
{
[JsonPropertyName("user_id")] // 指定 JSON 键名为 "user_id"
public int Id { get; set; }
[JsonPropertyName("full_name")]
public string Name { get; set; }
// 其他属性...
}
序列化后 Id 对应的 JSON 键为 "user_id"。
处理复杂类型:嵌套对象与集合
System.Text.Json 支持自动序列化嵌套对象和集合。
public class Order
{
public int OrderId { get; set; }
public User Customer { get; set; } // 嵌套对象
public List<Product> Products { get; set; } // 集合
}
public class Product
{
public string ProductName { get; set; }
public decimal Price { get; set; }
}
var order = new Order
{
OrderId = 101,
Customer = user, // 复用前面的 User 对象
Products = new List<Product>
{
new Product { ProductName = "笔记本电脑", Price = 5999 },
new Product { ProductName = "无线鼠标", Price = 99 }
}
};
string orderJson = JsonSerializer.Serialize(order, new { WriteIndented = true });
Console.WriteLine(orderJson);
输出结果:
{
"OrderId": 101,
"Customer": {
"Id": 1,
"Name": "张三",
"Age": 25,
"Hobbies": [
"阅读",
"编程",
"旅行"
]
},
"Products": [
{
"ProductName": "笔记本电脑",
"Price": 5999
},
{
"ProductName": "无线鼠标",
"Price": 99
}
]
}
使用第三方库:Newtonsoft.Json(Json.NET)
尽管 System.Text.Json 是内置推荐,但 Newtonsoft.Json(Json.NET)仍是 .NET 生态中使用最广泛的 JSON 库(尤其在 .NET Framework 项目中),功能更丰富,社区支持更成熟。
安装 NuGet 包
需通过 NuGet 安装 Newtonsoft.Json:
Install-Package Newtonsoft.Json
基本用法:JsonConvert
Newtonsoft.Json 通过静态类 JsonConvert 提供序列化方法,用法与 System.Text.Json 类似:
示例:简单对象序列化
using Newtonsoft.Json;
var user = new User
{
Id = 1,
Name = "李四",
Age = 30,
Hobbies = new List<string> { "游戏", "音乐" }
};
// 序列化为 JSON 字符串
string jsonString = JsonConvert.SerializeObject(user);
Console.WriteLine(jsonString);
输出结果:
{"Id":1,"Name":"李四","Age":30,"Hobbies":["游戏","音乐"]}
自定义序列化行为
Newtonsoft.Json 的配置通过 JsonSerializerSettings 类实现,支持更灵活的控制:
(1)格式化输出
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented // 缩进格式
};
string formattedJson = JsonConvert.SerializeObject(user, settings);
Console.WriteLine(formattedJson);
(2)属性命名策略
通过 ContractResolver 控制命名策略,例如驼峰命名:
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver() // 驼峰命名
};
string camelCaseJson = JsonConvert.SerializeObject(user, settings);
Console.WriteLine(camelCaseJson);
(3)忽略属性
通过 [JsonIgnore] 特性忽略特定属性:
public class User
{
public int Id { get; set; }
[JsonIgnore] // 序列化时忽略此属性
public string Password { get; set; }
public string Name { get; set; }
}
或通过 JsonSerializerSettings 全局忽略:
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore, // 忽略 null 值
DefaultValueHandling = DefaultValueHandling.Ignore // 忽略默认值
};
(4)日期格式处理
默认情况下,DateTime 会序列化为 ISO 8601 格式(如 "/Date(1633027200000)/"),可通过 JsonConverter 自定义格式:
public class CustomDateTimeConverter : IsoDateTimeConverter
{
public CustomDateTimeConverter()
{
DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; // 指定日期格式
}
}
// 在类上应用特性
public class Event
{
public string EventName { get; set


还没有评论,来说两句吧...