I'm using AspNet Core 3.1. I implemented a custom Json converter for NewtonSoft Json as below:
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));
}
}
And registered in DI like so
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(o => { o.ModelBinderProviders.Insert(0, new DeviceModelBinderProvider()); })
.AddNewtonsoftJson(o => o.SerializerSettings.Converters.Insert(0, new CustomConverter()));
}
And my controller looks like:
[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
[HttpPost]
public IActionResult Test([FromBody]Device dto)
{
if (dto == null)
{
return this.Problem();
}
return Ok();
}
}
However, when deserializing the DTO, this formatter is not getting called. It does get called when serialising the response. My request from Postman looks like
curl --location --request POST 'http://localhost:5000/test' \
--header 'Content-Type: application/json' \
--data-raw '{
"ScreenSize": "1",
"Kind": "SmartPhone"
}'