将所有通过API ASP.NET CORE 3.x发布的字符串进行修剪

6

关于许多 .Net 版本的信息到处都是,我找不到一个具体的最新示例。

我正在尝试自动修剪我自动发布到 API 的所有“字符串”值。

请注意,这是 ASP.NET CORE 3.x,它引入了新的命名空间“System.Text.Json”等,而不是大多数旧示例使用的 Newtonsoft 命名空间。

Core 3.x 的 API 不使用模型绑定,而是使用 JsonConverter(s)。我正在尝试覆盖它们,因此模型绑定示例在这里不相关。

以下代码确实有效,但这意味着我必须放置注释:

[JsonConverter(typeof(TrimStringConverter))]

在我发布的所有API模型中,如何才能在每个字符串上方执行此操作,以便它只对全局定义为字符串的任何内容执行?
// TrimStringConverter.cs

// Used https://github.com/dotnet/runtime/blob/81bf79fd9aa75305e55abe2f7e9ef3f60624a3a1/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/JsonValueConverterString.cs
// as a template From the DotNet source.


using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace User
{
    public class TrimStringConverter : JsonConverter<string?>
    {
        public override string? Read(
            ref Utf8JsonReader reader, 
            Type typeToConvert, 
            JsonSerializerOptions options)
        {
            return reader.GetString().Trim();
        }

        public override void Write(
            Utf8JsonWriter writer, 
            string? value, 
            JsonSerializerOptions options)
        {
            writer.WriteStringValue(value);
        }
    }
}

// CreateUserApiModel.cs

using System.Text.Json.Serialization;

namespace User
{
    public class CreateUserApiModel
    {
        // This one will get trimmed with annotation.
        [JsonConverter(typeof(TrimStringConverter))]
        public string FirstName { get; set; }

        // This one will not.
        public string LastName { get; set; }
    }
}

// ApiController

[HttpPost]
[Route("api/v1/user/create")]
public async Task<IActionResult> CreateUserAsync(CreateUserApiModel createUserApiModel)
{
    // createUserApiModel.FirstName << Will be trimmed.
    // createUserApiModel.LastName, << Wont be trimmed.

    return Ok("{}");
}

注册全局转换器是一个选项吗? - ProgrammingLlama
你能否将你的转换器添加到在ConfigureServices中使用.AddJsonOptions时可以访问的“全局”JsonSerializerOptions中吗?(您必须调用AddControllers或AddMvc / AddMvcCore来链接AddJsonOptions) - pinkfloydx33
在我的情况下,我猜你的意思是将选项添加到 Startup.cs 中的 services.AddControllers();。你有一个正确语法的示例吗? - William Humphreys
1
类似于(从记忆中)services.AddControllers().AddJsonOptions(o => o.JsonSerializerOptions.Converters.Add(new TrimStringConverter())的内容。 - pinkfloydx33
读者应该使用 return reader.GetString()?.Trim(); 来防止可能的 NullReferenceException - nod
显示剩余4条评论
1个回答

8
关于@pinkfloydx33的评论,以下内容似乎可以正常工作。
// Startup.cs

services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new TrimStringConverter());
     });

同样需要注意的是,使用原始问题中的代码的任何人。转换器仅在读取时修剪而不是在写入时修剪,除非您添加另一个trim()。我只需要它一种方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接