Атрибут DataMember не соблюдается в dotnet core 3.0

Я создал образец проекта веб-API dotnet core 3.0 и внес следующие изменения:

  1. Создайте класс модели TestData
using System.Runtime.Serialization;
namespace WebApplication17.Models
{
    [DataContract]
    public class TestData
    {
        [DataMember(Name = "testaction")]
        public string Action { get; set; }
    }
}

Затем я внес изменения в контроллер WeatherForecastController, чтобы добавить конечную точку публикации.

[HttpPost("package/{packageName}/version/{version}")]
public void Post(string packageName, string version, [FromBody] TestData activityPayload)
{
    Console.WriteLine(activityPayload.Action);
}

Сейчас позвонил почтальон или завивался телом

{   
    "testaction": "action"  
}

По-прежнему в Post методе WeatherForecastController, activityPayload.Action null.

Я ожидал, что это будет действие


person Jitendra    schedule 16.09.2019    source источник


Ответы (3)


Asp.Net Core 3 не поддерживает [DataContract], [DataMember] по умолчанию, и не похоже, что они добавят его в ближайшее время на основе этой проблемы Github

Поддержка System.Text.Json для System.Runtime.Serialization

Если вы хотите вернуться к предыдущему значению по умолчанию с использованием Newtonsoft.Json, которое учитывает эти атрибуты, вам необходимо сделать следующее:

  1. Установите пакет NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson.

  2. В ConfigureServices() добавьте вызов AddNewtonsoftJson()

public void ConfigureServices(IServiceCollection services) {
    //...

    services.AddControllers()
        .AddNewtonsoftJson(); //<--

    //...
}
person Nkosi    schedule 17.10.2019

Начиная с .NET Core 3.0 RC1 библиотека System.Text.Json не поддерживает атрибуты System.Runtime.Serialization. Вы можете найти проблему на GitHub, который отслеживает это упущение, но сейчас он не отображается. что есть какое-либо намерение это изменить.

Вариант 1: Newtonsoft.Json

Тем временем вы можете переключиться на использование Newtonsoft.Json в качестве сериализатора JSON для ASP.NET Core 3.0, который должен восстановить эту функциональность (за счет отказа от использования синтаксического анализатора System.Text.Json, который работает немного быстрее).

Сначала добавьте ссылку на пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson в своем проекте:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
  </ItemGroup>
</Project>

А затем вызовите добавочный номер в вашей коллекции услуг.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
            .AddNewtonsoftJson();
}

Вариант 2: используйте System.Text.Json.Serialization

С другой стороны, если вы счастливы определять свои модели без атрибутов System.Runtime.Serialization и вместо этого использовать атрибуты System.Text.Json.Serialization, вы можете сделать следующее:

using System.Text.Json.Serialization;
namespace WebApplication17.Models
{
    public class TestData
    {
        [JsonPropertyName("testaction")]
        public string Action { get; set; }
    }
}

Вы можете найти полный список поддерживаемых атрибутов здесь: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonpropertynameattribute?view=netcore-3.0

person Jitendra    schedule 17.10.2019

Добавьте атрибут [JsonPropertyName("testaction")] к свойству Action. Это должно решить вашу проблему.

Подробнее см. Здесь: https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/.

person Yogesh    schedule 17.10.2019