ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

.NET JSON序列化方案全解析与性能对比

.NET JSON序列化方案全解析与性能对比 1. 为什么我们需要多种JSON序列化方案在.NET生态中处理JSON数据就像厨师选择刀具——不同的场景需要不同的工具。我经历过从早期的WebService到现代微服务的完整技术演进深刻体会到JSON序列化方案的选择直接影响着系统性能、开发效率和维护成本。先看几个典型痛点场景高并发API服务中序列化性能直接决定QPS天花板遗留系统改造时需要处理特殊日期格式或循环引用跨平台交互时要确保各端对JSON标准的理解一致大数据传输场景下内存分配会成为性能瓶颈2. 主流序列化方案全景对比2.1 内置方案JavaScriptSerializer已过时但需了解这个最早出现在.NET Framework 3.5中的方案现在看就像老式打字机var serializer new JavaScriptSerializer(); string json serializer.Serialize(new { Name 张三, Age 28 });典型缺陷不支持泛型集合日期格式固定为/Date(ticks)/性能比后续方案低3-5倍实战建议仅维护遗留系统时需要接触新项目绝对不要使用2.2 官方首选System.Text.Json.NET Core这是微软现在主推的现代化方案就像瑞士军刀般均衡var user new User(李四, 30); string json JsonSerializer.Serialize(user);性能基准百万次序列化方案耗时(ms)内存分配(MB)JavaScriptSerializer4200320Newtonsoft.Json850190System.Text.Json620110高级配置示例var options new JsonSerializerOptions { PropertyNamingPolicy JsonNamingPolicy.CamelCase, WriteIndented true, DefaultIgnoreCondition JsonIgnoreCondition.WhenWritingNull };2.3 第三方王者Newtonsoft.Json这个经久不衰的库就像专业厨房的多功能料理机string json JsonConvert.SerializeObject(product, new JsonSerializerSettings { Formatting Formatting.Indented, ContractResolver new CamelCasePropertyNamesContractResolver() });不可替代的优势完善的类型转换器系统灵活的循环引用处理丰富的注解支持如[JsonProperty]更宽松的JSON标准兼容性2.4 性能怪兽Utf8Json第三方当需要处理GB级JSON数据时这个方案就像工业级切割机byte[] jsonBytes Utf8Json.JsonSerializer.Serialize(data);其核心优势零内存分配的Writer API直接处理UTF8字节流预编译序列化器实测对比1GB数据序列化方案耗时(s)GC次数System.Text.Json4.28Utf8Json2.103. 深度技术选型指南3.1 性能敏感场景决策树graph TD A[开始] -- B{需要处理GB级数据?} B --|是| C[Utf8Json] B --|否| D{使用.NET Core 3.0?} D --|是| E[System.Text.Json] D --|否| F[Newtonsoft.Json]3.2 特殊需求应对方案日期格式处理// System.Text.Json options.Converters.Add(new DateTimeConverter(yyyy-MM-dd HH:mm)); // Newtonsoft.Json settings.DateFormatString yyyy-MM-dd HH:mm;多态类型处理[JsonDerivedType(typeof(Student), student)] [JsonDerivedType(typeof(Teacher), teacher)] public class Person {} // Newtonsoft需配合TypeNameHandling设置4. 实战中的血泪经验4.1 循环引用破局之道典型错误public class Department { public ListEmployee Staff { get; set; } } public class Employee { public Department Workplace { get; set; } }解决方案对比方案处理方式内存影响Newtonsoft.JsonReferenceLoopHandling.Ignore小System.Text.JsonReferenceHandler.Preserve较大Utf8Json需自定义Resolver最小4.2 跨平台兼容性陷阱遇到过最棘手的案例前端把long型ID自动转为字符串Java服务端对DateTimeOffset的时区处理差异浮点数精度在不同语言中的表现不一致通用解决方案options.NumberHandling JsonNumberHandling.AllowReadingFromString;5. 未来演进方向微软正在System.Text.Json中新增的功能源码生成器AOT编译支持更完善的多态支持增强的LINQ to JSON API第三方库的创新方向基于Span的零拷贝处理二进制JSON格式支持流式处理大型文档6. 我的个人工具箱配置根据项目类型的选择策略Web API项目// Startup.cs services.AddControllers() .AddJsonOptions(options { options.JsonSerializerOptions.PropertyNamingPolicy JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.DictionaryKeyPolicy JsonNamingPolicy.CamelCase; });高性能微服务// 预编译序列化器 [JsonSerializable(typeof(Order))] internal partial class OrderContext : JsonSerializerContext {} // 使用生成的序列化器 JsonSerializer.Serialize(order, OrderContext.Default.Order);Unity游戏开发// 必须使用Newtonsoft.Json // 安装Unity的com.unity.nuget.newtonsoft-json包 PlayerPrefs.SetString(save, JsonConvert.SerializeObject(gameState));
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进