EF Core 6下如何将API返回Data列表属性转为小驼峰?
问题描述
当前API返回的JSON格式如下:
{ "Success": true, "Data": [ { "ID": 1, "ProcedureID": 1, "Channel": "Channel 1", "ResolvedTime": "Anytime", "Description": "No description" } ], "StatusCode": 200, "Message": "" }
期望返回结果仅Data列表内对象的属性名转为小驼峰,外层属性名保持不变:
{ "Success": true, "Data": [ { "id": 1, "procedureID": 1, "channel": "Channel 1", "resolvedTime": "Anytime", "description": "No description" } ], "StatusCode": 200, "Message": "" }
当前使用EF Core 6,Program.cs中已配置Newtonsoft.Json:
builder.Services.AddControllers().AddNewtonsoftJson(options =>{ options.SerializerSettings.ContractResolver = new DefaultContractResolver(); options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;});
如何实现Data列表内对象属性名的小驼峰格式化需求?
解决方案
提供两种适配不同场景的实现方式:
方案一:实体类属性添加特性(精准控制)
直接给Data列表对应的实体类属性添加[JsonProperty]特性,指定小驼峰名称。假设实体类名为ProcedureChannel,修改后代码如下:
public class ProcedureChannel { [JsonProperty("id")] public int ID { get; set; } [JsonProperty("procedureID")] public int ProcedureID { get; set; } [JsonProperty("channel")] public string Channel { get; set; } [JsonProperty("resolvedTime")] public string ResolvedTime { get; set; } [JsonProperty("description")] public string Description { get; set; } }
此方式无需修改全局配置,精准控制单个实体类的序列化规则,适合仅需调整少数实体的场景。
方案二:自定义ContractResolver(批量控制)
若需批量对特定类型应用小驼峰格式,同时保留外层属性名,可自定义序列化解析器:
- 编写自定义解析器类:
public class CustomContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); // 仅对目标实体类的属性转换为小驼峰 if (member.DeclaringType == typeof(ProcedureChannel)) { property.PropertyName = char.ToLowerInvariant(property.PropertyName[0]) + property.PropertyName.Substring(1); } return property; } }
- 修改
Program.cs中的序列化配置,替换为自定义解析器:
builder.Services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new CustomContractResolver(); options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; });
此方式适合多实体类需统一格式的场景,只需在解析器中添加更多目标类型判断即可扩展。
内容的提问来源于stack exchange,提问作者louis26
相关产品推荐
相关产品推荐

