dotnet核心3.0不支持DataMember属性

时间:2019-09-16 23:03:03

标签: c# .net-core asp.net-core-webapi .net-core-3.0 asp.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; }
    }
}

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

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

现在我打了个邮递员打来的电话,或者curl着身体

{   
    "testaction": "action"  
}

Post的{​​{1}}方法中,WeatherForecastController null

我原以为这是“行动”

3 个答案:

答案 0 :(得分:3)

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

System.Text.Json support to System.Runtime.Serialization

如果您要切换回使用Newtonsoft.Json的默认设置(它会保留这些属性),则必须执行以下操作:

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

  2. ConfigureServices()中将通话添加到AddNewtonsoftJson()

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

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

    //...
}

答案 1 :(得分:2)

| client_tracking_id | external_id | transaction_date | transaction_type | transaction_amount | |--------------------|--------------|----------------------|------------------|--------------------| | 281101002240 | 281101002240 | 2019-08-14T18:03:04Z | Purchase | 2000 | 属性添加到[JsonPropertyName("testaction")]属性。这应该可以解决您的问题。

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

答案 2 :(得分:2)

从.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>

然后在您的服务集合中调用该分机。

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

相关问题