C# ASP Web API:将对象序列化为JSON时指定自定义字段名

C# ASP Web API:将对象序列化为JSON时指定自定义字段名,c#,json,rest,asp.net-core,asp.net-web-api,C#,Json,Rest,Asp.net Core,Asp.net Web Api,我的解决方案中有几个项目。以下是其中两个: API(netcoreapp3.1 asp web API-因此其中有System.Text.Json) 实体(netstandard2.0类库-因此那里没有System.Text.Json) 实体包含my API的DTO(数据传输对象)。我需要为DTO提供自己的JSON字段名。我遇到了这个问题,所以我尝试使用JsonPropertyNameAttribute,它由System.Text.Json(.net core 3)提供,但它不起作用 我需要

我的解决方案中有几个项目。以下是其中两个:

  • API(netcoreapp3.1 asp web API-因此其中有System.Text.Json)
  • 实体(netstandard2.0类库-因此那里没有System.Text.Json)
实体包含my API的DTO(数据传输对象)。我需要为DTO提供自己的JSON字段名。我遇到了这个问题,所以我尝试使用JsonPropertyNameAttribute,它由System.Text.Json(.net core 3)提供,但它不起作用

我需要做什么来指定自定义JSON字段名?将Entities项目类型更改为netcoreapp3.1(那么其他.net标准2.0库是否存在问题)?使用不同的方式为DTO指定自定义JSON字段名(我不想使用Newtonsoft.JSON,因为我听说它与.net core 3+asp web API存在兼容性问题)

更新:如前所述,有一个为其他.net版本提供System.Text.Json序列化和反序列化的

  • .NET标准2.0及更高版本
  • .NET Framework 4.7.2及更高版本
  • .NET核心2.0、2.1和2.2

如果您不想使用Newtonsoft.Json(到),那么您确实遇到了您确定的第22个难题。但是,如果自定义名称都采用相同的格式,则可以设置一个。i、 e


…使用
PascalToUnderscoreNamingPolicy
作为重写
JsonNamingPolicy.ConvertName
的类,以便将“CreationDate”等转换为“creation\u date”。

您可以将DTO映射到API项目中指定的另一个类,然后使用JsonPropertyNameAttribute。@JacobSobus,但我不想在API项目中包含类似DTO的类。这就是我决定将API和实体放在两个独立项目中的原因。@JacobSobus,在我的实体项目中,我有两种类型的实体。第一个是EF核心模型(与我的DB结构相匹配)。第二种类型是在API端点内部使用的DTO。他们的看法不同。我需要一种方法将JSON序列化DTO的字段名从“CreationDate”更改为“creation_date”。然后我将继续将DTO提取到其他项目,这些项目将由API和实体使用。将其作为.net核心项目,并使用JsonPropertyNameAttribute:)这将是最好的选择(IMHO:)@JacobSobus谢谢您的建议。我想我同意你的看法。谢谢你的回答,但是我的自定义名称不一定与属性名称匹配当你说
JsonPropertyNameAttribute
“不起作用”你是什么意思?这些属性即使应用到DTO上也会被忽略?我的意思是[JsonPropertyName]属性由System.Text.Json提供(仅在.net core 3中可用),不能在.net标准项目(Entities项目是netstandard 2.0类库)中使用。System.Text.Json通过nuget包支持.net标准2.0(请参阅)。谢谢。我不知道。
services.AddControllers()
.AddJsonOptions(options =>
{
    options.JsonSerializerOptions.PropertyNamingPolicy = new PascalToUnderscoreNamingPolicy(),
});