C#如何将实体模型转换为JSON:全面指南
在软件开发中,实体模型(Entity Model)与JSON(JavaScript Object Notation)之间的转换是非常常见的需求,无论是前后端数据交互、API接口开发,还是配置文件存储,都经常需要将C#中的类对象(实体模型)序列化为JSON字符串,或将JSON字符串反序列化为实体对象,本文将详细介绍在C#中将实体模型转换为JSON的多种方法,包括内置序列化机制、第三方库的使用,以及不同场景下的最佳实践。
使用System.Text.Json(. Core 3.0+推荐)
.NET Core 3.0及更高版本内置了System.Text.Json命名空间,提供了高性能的JSON序列化和反序列化功能,无需额外安装第三方库,是现代.NET开发的首选方案。
基本序列化:将实体模型转为JSON字符串
假设我们有一个简单的实体模型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; }
}
使用System.Text.Json将其序列化为JSON字符串的步骤如下:
using System.Text.Json;
// 1. 创建实体对象
var user = new User
{
Id = 1,
Name = "张三",
Age = 25,
Hobbies = new List<string> { "阅读", "编程", "旅行" }
};
// 2. 序列化为JSON字符串
string jsonString = JsonSerializer.Serialize(user);
// 输出结果
Console.WriteLine(jsonString);
运行结果:
{"Id":1,"Name":"张三","Age":25,"Hobbies":["阅读","编程","旅行"]}
自定义序列化行为
通过JsonSerializerOptions可以灵活控制序列化过程,
- 格式化输出(缩进):
WriteIndented = true - 忽略null值:
IgnoreNullValues = true - 自定义属性命名:
PropertyNamingPolicy = JsonNamingPolicy.CamelCase(驼峰命名)
示例代码:
var options = new JsonSerializerOptions
{
WriteIndented = true, // 格式化输出(缩进)
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 属性名转为驼峰式(如Name -> name)
IgnoreNullValues = true // 忽略null值的属性
};
string formattedJson = JsonSerializer.Serialize(user, options);
Console.WriteLine(formattedJson);
输出结果(格式化+驼峰命名):
{
"id": 1,
"name": "张三",
"age": 25,
"hobbies": [
"阅读",
"编程",
"旅行"
]
}
处理复杂场景:循环引用、自定义转换器等
如果实体模型中存在循环引用(如A包含B,B又包含A),直接序列化会抛出StackOverflowException,可通过ReferenceHandler解决:
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.IgnoreCycles // 忽略循环引用
};
对于特殊类型(如DateTime、Enum),可通过自定义JsonConverter实现序列化逻辑,将DateTime格式化为指定字符串:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
// 使用自定义转换器
var options = new JsonSerializerOptions { Converters = { new DateTimeConverter() } };
使用Newtonsoft.Json(经典方案,兼容性更强)
尽管System.Text.Json已成为内置首选,但Newtonsoft.Json(又称Json.NET)凭借其丰富的功能和广泛的兼容性,仍是许多老项目或需要复杂场景支持的首选,使用前需通过NuGet安装:
Install-Package Newtonsoft.Json
基本序列化
同样以User实体为例,Newtonsoft.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":["篮球","音乐"]}
自定义序列化行为
通过JsonSerializerSettings可以灵活配置序列化选项:
- 格式化输出:
Formatting.Indented - 驼峰命名:
ContractResolver = new CamelCasePropertyNamesContractResolver() - 忽略null值:
NullValueHandling = NullValueHandling.Ignore
示例代码:
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented, // 格式化输出
ContractResolver = new CamelCasePropertyNamesContractResolver(), // 驼峰命名
NullValueHandling = NullValueHandling.Ignore // 忽略null值
};
string formattedJson = JsonConvert.SerializeObject(user, settings);
Console.WriteLine(formattedJson);
输出结果:
{
"id": 1,
"name": "李四",
"age": 30,
"hobbies": [
"篮球",
"音乐"
]
}
高级特性:特性标记、LINQ to JSON等
Newtonsoft.Json支持通过特性标记控制序列化行为,
[JsonIgnore]:忽略属性[JsonProperty("propertyName")]:自定义JSON属性名[JsonConverter]:指定自定义转换器
示例:
public class User
{
[JsonIgnore] // 忽略Id属性,不序列化到JSON
public int Id { get; set; }
[JsonProperty("username")] // 将Name属性序列化为"username"
public string Name { get; set; }
public int Age { get; set; }
}
var user = new User { Id = 2, Name = "王五", Age = 28 };
string json = JsonConvert.SerializeObject(user);
Console.WriteLine(json);
输出结果:
{"username":"王五","Age":28}
Newtonsoft.Json还提供JObject、JArray等LINQ to JSON API,可直接操作JSON对象:
JObject jsonObject = new JObject
{
new JProperty("id", 3),
new JProperty("name", "赵六"),
new JArray("hobbies", new[] { "游泳", "摄影" })
};
Console.WriteLine(jsonObject.ToString());
对比与选择:System.Text.Json vs Newtonsoft.Json
| 特性 | System.Text.Json | Newtonsoft.Json |
|---|---|---|
| 版本支持 | .NET Core 3.0+、.NET 5/6/7+ | .NET Framework、.NET Core全版本 |
| 性能 | 更快(基于高性能API) | 略慢(功能丰富带来的开销) |
| 功能丰富度 | 基础功能完善,高级功能较少 | 功能极强(LINQ to JSON、特性标记等) |
| 第三方依赖 | 无(内置) | 需NuGet安装 |
| 配置方式 | JsonSerializerOptions |
JsonSerializerSettings |
| 兼容性 | 默认严格遵循JSON标准,可能与旧版JSON不兼容 | 默认兼容性更好,可处理非标准JSON |
选择建议:
- 新项目(.NET Core 3.0+):优先使用
System.Text.Json,性能更优,无需额外依赖。 - 老项目/复杂场景:若已使用
Newtonsoft.Json或需要其高级功能(如LINQ to JSON),可继续使用。 - 需要兼容非标准JSON:
Newtonsoft.Json更灵活。
常见问题与解决方案
循环引用导致序列化失败
问题:实体模型中存在双向引用(如Parent包含Child,Child又包含Parent),序列化时抛出StackOverflowException。
解决:
System.Text.Json:使用ReferenceHandler.IgnoreCycles。Newtonsoft.Json:使用PreserveReferenceHandling.All或ReferenceLoopHandling.Ignore。
// System.Text.Json var options = new JsonSerializer



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