如何为 dotnet 核心 api 正确设置 snake case JSON?
How to properly set up snake case JSON for dotnet core api?
我已经通过在我的 Startup.cs
中使用以下内容将 api 响应 序列化为 snake_case
命名约定。这样 returns 我的 DTO 就像蛇壳一样 JSON.
services
.AddMvc()
.AddJsonOptions(x =>
{
x.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
};
});
这就是我想要的一半。但是当我 post snake-cased JSON 时,请参见下面的示例,它不会将值绑定到我在 api 上的 DTO。例如 UserProfile
数组和 CreatedOn
、ModifiedOn
没有得到任何值。
{
"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
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
}
编辑:
好吧,原来我在 JSON 中遗漏了一些值,我 posted 到 API。 api 需要它们,但没有出现任何错误或其他问题。
因此,为了回答这个问题,根据我的经验,使用以下内容足以将 JSON 输出/输入用于 dotnet 核心 api。相反,它只是让预期的模型 null
叹息。
services
.AddMvc()
.AddJsonOptions(x =>
{
x.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
};
});
您忘记了引号:
"modified_on": 2017-02-08T19: 50: 31.690Z,
改变这个,同样有效。
自 ASP.NET Core 3.0
services.AddMvc().AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
};
});
我已经通过在我的 Startup.cs
中使用以下内容将 api 响应 序列化为 snake_case
命名约定。这样 returns 我的 DTO 就像蛇壳一样 JSON.
services
.AddMvc()
.AddJsonOptions(x =>
{
x.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
};
});
这就是我想要的一半。但是当我 post snake-cased JSON 时,请参见下面的示例,它不会将值绑定到我在 api 上的 DTO。例如 UserProfile
数组和 CreatedOn
、ModifiedOn
没有得到任何值。
{
"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
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
}
编辑:
好吧,原来我在 JSON 中遗漏了一些值,我 posted 到 API。 api 需要它们,但没有出现任何错误或其他问题。
因此,为了回答这个问题,根据我的经验,使用以下内容足以将 JSON 输出/输入用于 dotnet 核心 api。相反,它只是让预期的模型 null
叹息。
services
.AddMvc()
.AddJsonOptions(x =>
{
x.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
};
});
您忘记了引号:
"modified_on": 2017-02-08T19: 50: 31.690Z,
改变这个,同样有效。
自 ASP.NET Core 3.0
services.AddMvc().AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = new SnakeCaseNamingStrategy()
};
});