You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 8 Web API:反序列化与序列化用不同JSON字段名

解决方案

方法一:使用JsonDeserializationName特性(推荐,.NET 7+支持)

这是最直接的方案,专门控制反序列化的字段匹配规则,序列化则遵循全局配置或属性本身的命名逻辑。

  1. 定义DTO类:在属性上添加[JsonDeserializationName],指定反序列化时要匹配的数据库JSON字段名:
using System.Text.Json.Serialization;

public class FooDto
{
    // 反序列化时识别数据库返回的"product_id"字段
    [JsonDeserializationName("product_id")]
    public int ProductId { get; set; }
}
  1. 配置全局序列化规则:在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}。

方法二:手动指定序列化/反序列化规则(特殊场景适用)

如果需要更灵活的命名控制,可以手动为反序列化和序列化分别配置规则:

  1. 定义纯C# DTO类:无需添加任何序列化特性:
public class FooDto
{
    public int ProductId { get; set; }
}
  1. 手动反序列化数据库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);
  1. 序列化返回客户端:使用驼峰命名规则输出:
var serializeOpts = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
var responseJson = JsonSerializer.Serialize(fooDto, serializeOpts);

如果是在API控制器中直接返回FooDto对象,ASP.NET Core会自动沿用全局配置的序列化规则,只需确保全局配置正确即可。

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:54:54