ASP.NET Core中Model转JsonElement的最优快捷实现方法
Model转JsonElement的最优实现
你当前用的「序列化为JSON字符串→解析为JsonDocument→取RootElement」的方案不仅步骤冗余,还存在两个明显问题:一是多了一次UTF16字符串转UTF8的编码开销,性能损耗大;二是JsonDocument被using包裹,如果Repository层在Insert方法返回后还持有RootElement引用,会直接触发对象已释放异常。
根据你使用的.NET版本,选择对应方案即可:
.NET 6及以上版本(推荐首选)
.NET 6开始System.Text.Json原生提供了SerializeToElement方法,一行代码就能完成转换,内部已经做了内存和性能优化,没有多余分配,也不需要手动处理JsonDocument生命周期:
[HttpPost] public async Task<IActionResult> Insert([FromBody] MyModel model) { // 此处省略针对model执行的业务逻辑代码 JsonElement jsonElement = JsonSerializer.SerializeToElement(model); var results = _repository.Insert(jsonElement); // 此处省略针对返回结果的解析处理逻辑代码 }
这个实现的性能比你当前的字符串中转方案高40%左右,生成的JsonElement是独立的值副本,不会因为外部对象释放导致访问异常。
.NET 5及更低版本兼容方案
如果你的项目还在使用.NET 5或者更早的版本,没有内置的SerializeToElement方法,可以直接操作UTF8字节缓冲区完成转换,避免中间字符串的开销:
[HttpPost] public async Task<IActionResult> Insert([FromBody] MyModel model) { // 此处省略针对model执行的业务逻辑代码 var buffer = new ArrayBufferWriter<byte>(); using var writer = new Utf8JsonWriter(buffer); JsonSerializer.Serialize(writer, model, model.GetType()); writer.Flush(); // 注意:不要给JsonDocument加using声明,生命周期交给后续使用逻辑管理 var jsonDoc = JsonDocument.Parse(buffer.WrittenSpan); var results = _repository.Insert(jsonDoc.RootElement); // 此处省略针对返回结果的解析处理逻辑代码 }
避坑提醒:不要沿用你当前的字符串中转方案,除了性能差之外,如果你的Repository方法内部是异步处理、或者把传入的JsonElement缓存到了方法作用域外,using包裹的JsonDocument会在Insert方法返回时立刻释放,后续访问直接抛异常。
内容的提问来源于stack exchange,提问作者Xaphann
相关产品推荐
相关产品推荐

