ASP.NET Core 8 Web API:反序列化与序列化用不同JSON字段名
解决方案
方法一:使用JsonDeserializationName特性(推荐,.NET 7+支持)
这是最直接的方案,专门控制反序列化的字段匹配规则,序列化则遵循全局配置或属性本身的命名逻辑。
- 定义DTO类:在属性上添加
[JsonDeserializationName],指定反序列化时要匹配的数据库JSON字段名:
using System.Text.Json.Serialization; public class FooDto { // 反序列化时识别数据库返回的"product_id"字段 [JsonDeserializationName("product_id")] public int ProductId { get; set; } }
- 配置全局序列化规则:在
Program.cs中设置序列化时采用驼峰命名,将C#的PascalCase属性名转为JSON的camelCase:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(options => { // 序列化时把"ProductId"转为"productId" options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 如果希望直接输出C#属性原名(如"ProductId"),将上述配置改为null即可 // options.JsonSerializerOptions.PropertyNamingPolicy = null; }); var app = builder.Build(); app.MapControllers(); app.Run();
完成配置后:
- 数据库返回的
{"product_id":1}会正确映射到FooDto的ProductId属性; - 接口返回给客户端的JSON会是
{"productId":1}。
方法二:手动指定序列化/反序列化规则(特殊场景适用)
如果需要更灵活的命名控制,可以手动为反序列化和序列化分别配置规则:
- 定义纯C# DTO类:无需添加任何序列化特性:
public class FooDto { public int ProductId { get; set; } }
- 手动反序列化数据库JSON:指定反序列化时使用蛇形命名策略,匹配数据库的
product_id字段:
using System.Text.Json; var jsonFromDb = "{\"product_id\":1}"; var deserializeOpts = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower }; var fooDto = JsonSerializer.Deserialize<FooDto>(jsonFromDb, deserializeOpts);
- 序列化返回客户端:使用驼峰命名规则输出:
var serializeOpts = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; var responseJson = JsonSerializer.Serialize(fooDto, serializeOpts);
如果是在API控制器中直接返回FooDto对象,ASP.NET Core会自动沿用全局配置的序列化规则,只需确保全局配置正确即可。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

