我正在使用 AspNet Core 3.1。我为 NewtonSoft Json 实现了一个自定义的 Json 转换器,如下所示:
public class CustomConverter : Newtonsoft.Json.JsonConverter
{
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return objectType.IsAssignableFrom(typeof(Device));
}
}
并像这样在DI中注册
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(o => { o.ModelBinderProviders.Insert(0, new DeviceModelBinderProvider()); })
.AddNewtonsoftJson(o => o.SerializerSettings.Converters.Insert(0, new CustomConverter()));
}
我的控制器看起来像:
[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
[HttpPost]
public IActionResult Test([FromBody]Device dto)
{
if (dto == null)
{
return this.Problem();
}
return Ok();
}
}
但是,在反序列化 DTO 时,不会调用此格式化程序。序列化响应时确实会调用它。我对邮递员的要求看起来像
curl --location --request POST 'http://localhost:5000/test' \
--header 'Content-Type: application/json' \
--data-raw '{
"ScreenSize": "1",
"Kind": "SmartPhone"
}'