Свойства определяемой пользователем структуры не десериализованы в веб-API .NET Core 3.0 (работает в .NET Core 2.2) - PullRequest
0 голосов
/ 08 октября 2019

У меня есть проект веб-API ASP.NET Core, нацеленный на .NET Core 3.0 со следующим контроллером:

public class FooController : ControllerBase
{
    [HttpPost]
    public ActionResult Post(Foo foo) => Ok()
}

Foo определен в отдельной библиотеке как:

public struct Foo
{
    public int Bar { get; }

    public Foo(int bar) => Bar = bar;
}

Я вызываю API из консольного приложения с помощью:

new HttpClient().PostAsJsonAsync("http://localhost:55555/api/foo", new Foo(1)).Wait();

Когда вводится метод контроллера, foo.Bar имеет значение по умолчанию 0. Я ожидаю, что оно будет равно 1.

Раньше все работало как положено в .NET Core 2.2. Десериализатор JSON обрабатывает свойства с частными установщиками в структурах через перегруженный конструктор с именами параметров, совпадающими с именами свойств (без учета регистра).

Это больше не работает в .NET Core 3.0 с базовыми структурами ( EDIT: из-за это как , на которое указал Мартин Уллрих ). Однако, если я использую стандартный тип структуры, такой как DateTime, он работает нормально. Есть ли что-то еще, что я должен теперь сделать с моей структурой, которую, например, DateTime уже поддерживает? Я уже пытался реализовать ISerializable на Foo с кодом ниже, но это не сработало.

public Foo(SerializationInfo info, StreamingContext context)
{
    Bar = (int)info.GetValue("bar", typeof(int));
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    info.AddValue("bar", Bar, typeof(int));
}

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 08 октября 2019

Новые System.Text.Json API не поддерживают все функции, которые поддерживает Newtonsoft.Json ("Json.NET"), включая десериализацию свойств только для чтения .

Если вам нужна эта функция, переключитесь на использование Newtonsoft.Json, как описано в Миграция с ASP.NET Core 2.2 на 3.0 Руководство:

services.AddMvc()
    .AddNewtonsoftJson();

или

services.AddControllers()
    .AddNewtonsoftJson();

DateTime уже известен стеком System.Text.Json в 3.0, и для него также есть реализация JsonConverter<T>: JsonConverterDateTime.

Для создания пользовательских преобразователей и регистрации их для ASP.NET Core см. https://stackoverflow.com/a/57334833/784387

...