将所有已发布的字符串修剪为API ASP.NET CORE 3.x



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

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

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

Core3.x API不使用模型绑定,而是使用我试图覆盖的JsonConverter,因此模型绑定示例在这里不相关。

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

[JsonConverter(typeof(TrimStringConverter))]

在API模型中的每个字符串之上,我也在发布。我如何才能做到这一点,使它只对全球所有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("{}");
}

对于上面@pinkfloydx33的评论,以下内容似乎正确。

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

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

最新更新