我正在使用WebAPI 2 / Newtonsoft.Json 9.0.1并遇到了反序列化问题。我有一个端点,将DTO作为其唯一参数。调用该方法时,只有一个DTO属性被反序列化,其余属性为空值或默认值。问题是由嵌套属性引起的,该类型是接口而不是具体类型。这是报告here的同一问题。
我知道我可以通过将类型更改为具体类型或将类型初始值设定项添加到现有接口属性来解决此问题,如下所示:
IAddressDTO Address { get; set; } = new AddressDTO();
我的问题是:为什么在反序列化期间没有抛出.NET异常/错误?如果反序列化存在问题,我想在运行时知道而不是它只是使用" null"到处。这对我来说在生产中造成了一个巨大的问题,如果像我预期的那样抛出异常,就可以避免。
如果我创建如下所示的单元测试,则会抛出异常。 WebAPI如何/为什么吞下这个例外,如何让它停止这样做呢?我需要自定义过滤器吗?这似乎应该是默认行为。
这是一个NUnit测试,它会抛出我想在运行WebAPI端点时看到的异常。
[Test]
public void DeserializationIssue()
{
string json = @"{
""OrderNumber"":155,
""Person"":{
""FirstName"":""AAAA"",
""LastName"":""B"",
""Address"":{
""line1"":""1234 Easy St"",
}
}
}";
PatientDTO patientDTO = JsonConvert.DeserializeObject<PatientDTO>(json);
Assert.That(patientDTO.Person.Address.Line1, Is.EqualTo("1234 Easy St"));
}
答案 0 :(得分:0)
RE:为什么在反序列化期间没有抛出.NET异常/错误?
我打赌异常正在发生,你只是没有设置检测它。有关webapi和全局异常处理的信息,请参阅此文章:https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/web-api-global-error-handling。
如果数据有问题,并且您知道此反序列化可能会失败,您可能希望将其包装在try / catch中并采取适当的操作。