实用技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > ASP.NET > 实用技巧 > .NET对象转JSON

.NET实现对象转JSON的方式总结

作者:码农刚子

对象转JSON这事儿,说大不大,说小不小,选对了库,代码跑得溜,选错了,要么功能不够用,要么性能拉胯,.NET里对象转JSON的方式确实不少,而且各有各的脾气,今天咱们就把这事捋清楚,以后别再纠结了

问题:对象转JSON,到底该用哪个库?

前几天在其中一个群里看到个挺有意思的对话:

说实话,这种困惑太常见了。.NET里对象转JSON的方式确实不少,而且各有各的脾气。今天咱们就把这事捋清楚,以后别再纠结了。

结论:三种主流方式,各有各的用武之地

一句话总结:

下面一个一个聊,看看它们到底有啥不一样。

展开:三种方式深度对比

1. System.Text.Json:官方出品,性能担当

从.NET Core 3.0开始,微软自己搞了个JSON处理库,就System.Text.Json。为啥要自己造轮子?因为要追求高性能、低内存占用,充分利用了Span<T>这些现代.NET特性。

基本用法:

using System.Text.Json;
var user = new { Name = "码农刚子", Age = 30, City = "北京" };
// 基础序列化
string jsonString = JsonSerializer.Serialize(user);
// 带配置的序列化(格式化输出)
var options = new JsonSerializerOptions 
{ 
    WriteIndented = true,  // 格式化,更易读
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase  // 驼峰命名
};
string prettyJson = JsonSerializer.Serialize(user, options);

它强在哪?

它坑在哪?

适用场景:

2. Newtonsoft.Json(Json.NET):老牌王者,功能最全

System.Text.Json出生之前,Newtonsoft.Json就是.NET社区的事实标准。几乎所有.NET项目都在用它,至今仍有大量项目依赖。

基本用法:

using Newtonsoft.Json;
var user = new { Name = "码农刚子", Age = 30, City = "北京" };
// 基础序列化
string jsonString = JsonConvert.SerializeObject(user);
// 带配置的序列化
var settings = new JsonSerializerSettings 
{ 
    Formatting = Formatting.Indented,  // 格式化
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore  // 忽略循环引用
};
string complexJson = JsonConvert.SerializeObject(user, settings);

它强在哪?

它坑在哪?

适用场景:

3. Utf8Json:性能狂魔,极致追求

如果你对性能有近乎苛刻的要求,比如高频交易、游戏服务器这类场景,可以看看Utf8Json

基本用法:

using Utf8Json;
var product = new { ID = 101, Name = "鼠标", Price = 99.9 };
// 直接序列化为二进制字节数组(最快)
byte[] jsonBytes = JsonSerializer.Serialize(product);
// 转成字符串
string jsonString = JsonSerializer.ToJsonString(product);

它强在哪?

它坑在哪?

适用场景:

怎么选?给个实在的建议

看完了上面三种,估计有人要问:那我到底该用哪个?

我一般这么建议:

1. 如果你是全新项目,用.NET Core 3.0以上:优先用System.Text.Json。官方出品,性能好,少装一个包是一个,以后升级也省心。

2. 如果你在维护老项目:继续用Newtonsoft.Json,别折腾。老代码跑得好好的,换库容易出幺蛾子。

3. 如果你的项目已经用了Newtonsoft,但想换:建议谨慎。两个库有不少差异:

真想换,做好充分测试。

4. 如果你在写性能敏感的核心代码:可以考虑局部用Utf8Json做优化,但别整个项目都用,毕竟功能有限。

实用小技巧

给System.Text.Json配置全局选项:

// Program.cs 或 Startup.cs
builder.Services.Configure<JsonOptions>(options =>
{
    options.SerializerOptions.WriteIndented = true;
    options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    options.SerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});

Newtonsoft.Json处理循环引用:

var settings = new JsonSerializerSettings
{
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,  // 忽略循环引用
    PreserveReferencesHandling = PreserveReferencesHandling.Objects  // 或保留引用
};
var json = JsonConvert.SerializeObject(objWithCycle, settings);

性能优化小贴士:

总结

对象转JSON这事儿,说大不大,说小不小。选对了库,代码跑得溜;选错了,要么功能不够用,要么性能拉胯。

记住这个原则,以后别再凭感觉选了。

到此这篇关于.NET实现对象转JSON的方式总结的文章就介绍到这了,更多相关.NET对象转JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文