首页 > 解决方案 > 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"
    }
}

标签: c#asp.netjsonasp.net-web-apiasp.net-core-3.1

解决方案


.NET Core 3.0 默认使用 System.Text.Json。另请查看描述此内容的官方文档文章

关于.NET Core 3.0 中application/vnd.api+jsonJSON: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版本。


推荐阅读