c# - ASP.NET Core 3.1 如何让控制器使用 System.Text.Json 进行序列化和反序列化
问题描述
我正在从 .NET CORE 2.2 转换为 3.1。是否可以强制控制器用于System.Text.Json
序列化和反序列化任何传入的请求和响应?基本上,当请求进来时我想使用System.Text.Json
,当响应出去时我想使用System.Text.Json
. 如果是,如何?
这样做的原因是微软确实在推动这个库作为Newtonsoft.Json
更安全和更快的替代品。但是,我似乎在 Microsoft 的页面上找不到任何反映这一点的文档。我发现微软不会更新他们的代码来使用这个新库很难。
更新
我无法System.Text.Json
通过解析来绑定模型application/vnd.api+json
- 模型为 NULL。只有当我使用解析时它才会绑定application/json
。这是有问题的,因为 JSON:API 规范需要application/vnd.api+json
(参见此处:https ://stackoverflow.com/a/61452011/4630376 )。我尝试用 装饰控制器[Consumes("application/vnd.api+json")]
,但这不起作用。
如何System.Text.Json
使用 绑定模型application/vnd.api+json
?我提出这个问题的最初假设是 .NET Core 3.1 没有使用System.Text.Json
. 由于除了一些评论之外没有人提供答案,我选择扩展这个问题。
更改密码模型:
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace ABC.Model.Clients
{
public class ChangePassword
{
public ChangePassword() { }
[Required]
[JsonPropertyName("old-password")]
public string OldPassword { get; set; }
[Required]
[JsonPropertyName("new-password")]
public string NewPassword { get; set; }
[Required]
[JsonPropertyName("confirm-password")]
public string ConfirmPassword { get; set; }
}
}
邮递员要求:
{
"data": {
"attributes": {
"old-password" : "**********",
"new-password" : "**********",
"confirm-password" : "**********"
},
"type": "change-passwords"
}
}
解决方案
.NET Core 3.0 默认使用 System.Text.Json。另请查看描述此内容的官方文档文章。
关于.NET Core 3.0 中application/vnd.api+json
的JSON:API支持。我不知道 ASP.NET Core 对此有任何支持。这是与普通 Web API 不同的标准。您不能只是将其添加为您接受的另一种类型并期望它起作用。
我在 GitHub JSON API .Net Core上找到了一个项目,它提供了一个框架来构建JSON:API兼容的 Web API 服务。.NET Core 3.0 的版本目前仍处于 Alpha 阶段,目前使用的不是您想要的 Newtonsoft.Json。您可以查看源代码以了解如何处理此类请求,并可能基于它构建您自己的解决方案。或者加入项目并帮助他们制作一个System.Text.Json
版本。
推荐阅读
- animation - 创建线条动画
- python - 如何断开 matplotlibs 事件处理程序?
- amazon-web-services - S3AbortableInputStream :并非所有字节都从 S3ObjectInputStream 中读取,因此中止 HTTP 连接。仅读取 ObjectMetadata 时发出警告
- java - Liquibase 3.7 和 3.8 是否不再支持 Java 7?
- r - 峰识别、优化 [R]
- autodesk-forge - 在伪造查看器中加载图钉不尊重 viewerState
- php - 如何获取 Forminator Plugin 中的总提交数
- sql - 将表作为参数传递给函数
- wpf - 在 MousOver 上的滚动查看器中更改滚动条的宽度
- swiftui - SwiftUI 嵌套列表不出现