dotnet core 3.0 不支持 DataMember 属性

Jit*_*dra 9 c# .net-core asp.net-core-webapi asp.net-core-3.0 .net-core-3.0

我创建了一个示例 dotnet core 3.0 Web API 项目并进行了以下更改,

  1. 创建模型类 TestData
using System.Runtime.Serialization;
namespace WebApplication17.Models
{
    [DataContract]
    public class TestData
    {
        [DataMember(Name = "testaction")]
        public string Action { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在控制器中进行了更改WeatherForecastController,以添加一个 post 端点

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

现在我从邮递员那里打来电话或用身体卷曲

{   
    "testaction": "action"  
}
Run Code Online (Sandbox Code Playgroud)

仍然在 的Post方法中WeatherForecastControlleractivityPayload.Actionnull

我期待它是“行动”

Nko*_*osi 11

默认情况下,Asp.Net Core 3 不支持[DataContract][DataMember]而且基于此 Github 问题,他们似乎不会很快添加它

System.Text.Json 支持 System.Runtime.Serialization

如果您想切换回使用的先前默认值Newtonsoft.Json,它确实尊重这些属性,那么您必须执行以下操作:

  1. 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包。

  2. ConfigureServices()添加呼叫AddNewtonsoftJson()

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

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

    //...
}
Run Code Online (Sandbox Code Playgroud)


Jit*_*dra 10

从 .NET Core 3.0 RC1 开始,该System.Text.Json库不支持System.Runtime.Serialization属性。您可以在GitHub 上找到一个问题,该问题正在跟踪此遗漏,但目前似乎没有任何打算改变这一点。

选项 1:Newtonsoft.Json

在此期间,您可以做的是切换到Newtonsoft.Json用作 ASP.NET Core 3.0 的 JSON 序列化程序,这应该会恢复此功能(代价是不利用System.Text.Json速度更快的解析器)。

首先,Microsoft.AspNetCore.Mvc.NewtonsoftJson在您的项目中添加对包的引用:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

然后在您的服务集合上调用扩展程序。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
            .AddNewtonsoftJson();
}
Run Code Online (Sandbox Code Playgroud)

选项 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到支持的属性的完整列表:https : //docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonpropertynameattribute?view=netcore-3.0


Yog*_*esh 6

[JsonPropertyName("testaction")]Action属性添加属性。这应该可以解决您的问题。

有关更多信息,请参见此处:https : //devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/