如何为dotnet核心api正确设置蛇案JSON?

时间:2017-02-20 20:43:14

标签: json .net-core asp.net-core-webapi

我已设法通过在snake_case中使用以下内容,将api 响应序列化为Startup.cs命名约定。这样它就可以将我的DTO作为蛇形JSON返回。

services
     .AddMvc()
     .AddJsonOptions(x =>
     {
         x.SerializerSettings.ContractResolver = new DefaultContractResolver
         {
             NamingStrategy = new SnakeCaseNamingStrategy()
         };
     });

这是我想要的一半。但是当我发布蛇形JSON时,请参见下面的示例,它不会将值绑定到api上的DTO。例如,UserProfile数组和CreatedOnModifiedOn没有获得任何值。

{
   "user_profiles": [
      {
         "id": 1,
         "created_on": "2017-02-08T19:54:59.370Z",
         "modified_on": "2017-02-18T14:10:42.248Z",
         "email": "my@email.com",
         "username": "my_username"
      }
   ],
   "id": 1,
   "created_on": "2017-02-08T19:50:31.690Z",
   "modified_on": 2017-02-08T19:50:31.690Z,
   "name": "My Company Name"
} 

设置它的正确方法是什么,以便API在发送到api 时处理蛇形JSON,而在api请求时将其作为蛇案发送?

我的DTO&#39>

 public class CompanyDto
 {
      public int Id { get; set; }
      public DateTime CreatedOn { get; set; }
      public DateTime ModifiedOn { get; set; }
      public string Name { get; set; }
      public IEnumerable<UserProfileDto> UserProfiles { get; set; }
 }

 public class UserProfileDto
 {
      public int Id { get; set; }
      public DateTime CreatedOn { get; set; }
      public DateTime ModifiedOn { get; set; }
      public string Email { get; set; }
      public string Username { get; set; }
 }

我在控制器上的PUT操作

[HttpPut("{id}")]
public async Task<IActionResult> Put(int id, [FromBody]CompanyDto value)
{
     // Body
}

修改

好的,我发现我错过了发布到API的JSON中的一些值。 api要求他们,但没有任何错误或事情。

所以为了回答这个问题,根据我的经验,使用以下内容就足以让蛇包装一个dotnet核心api的JSON输出/输入。相反,它只是使预期的模型null叹了口气。

services
     .AddMvc()
     .AddJsonOptions(x =>
     {
         x.SerializerSettings.ContractResolver = new DefaultContractResolver
         {
             NamingStrategy = new SnakeCaseNamingStrategy()
         };
     });

2 个答案:

答案 0 :(得分:2)

你忘了引号:

"modified_on": 2017-02-08T19: 50: 31.690Z,

更改此功能也适用。

答案 1 :(得分:1)

自ASP.NET Core 3.0起

services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = new SnakeCaseNamingStrategy()
    };
});