Ошибка десериализации Json Core Catch в промежуточном ПО - PullRequest
0 голосов
/ 23 сентября 2018

Я уверен, что упускаю что-то явно очевидное.

Возможно ли обрабатывать ошибки десериализации JSON в промежуточном программном обеспечении / десериализаторе по умолчанию .NET Core?Мне нужно убедиться, что конкретное значение является примитивом JSON, а не объектом / массивом.Если это не примитив, я бы хотел завершить запрос и вернуть соответствующий код состояния, прежде чем он попадет в контроллер.

Контроллер:

[HttpPost]
public IActionResult Post([FromBody] List<MyType> myTypes)
{
    // Logic ....

    return Created(new Uri("some-location/", UriKind.Relative), someValue);
}

Тело запроса:

[
    {
        "prop1": "some value",
        "prop2": "some value",
        "prop3": null
    },
    {
        "prop1": "some value",
        "prop2": "some value",
        "prop3": {
            "prop3-1": "some value"
        }
    }
]

Конструктор MyType проверяет переданные аргументы и выдает исключение в случае возникновения проблемы.prop3 в MyType - это поле dynamic.Я убедился, что исключение выдается, когда десериализуется второй элемент в теле запроса.

Все это выглядит довольно просто, но я просто не могу найти, где получить доступ к десериализатору по умолчанию.

Я попытался это , и он ловит ошибки, но только после того, как запрос поступил в контроллер.

Есть ли способ справиться с этим в аннотациях JSON?Я просмотрел документы Newtonsoft, но ничего не выскочило.

1 Ответ

0 голосов
/ 24 сентября 2018

Глядя на документацию здесь: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.1 Я думаю, что вы ищете AddJsonOptions ()

в Startup.cs:

services.AddMvc().AddJsonOptions(options =>
{
     options.SerializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Error;
});

Это не будетвыдает исключение, но оно не будет привязано, поэтому myTypes становится нулевым.

Тогда вы можете просто добавить нулевую проверку

[HttpPost]
public IActionResult Post([FromBody] List<MyType> myTypes)
{
    if(myTypes == null)
    {
        return BadRequest();
    }

    // Logic ....

    return Created(new Uri("some-location/", UriKind.Relative), someValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...