ASP.NET Core 7 + EF Core 7:如何修改JSON序列化格式?
问题描述
我正在开发一个生成测试数据的应用,需要将JSON结构从:
{ "id": 1, "data": "Daniel", "typeID": 1, "type": { "id": 1, "name": "Name", "templates": [] } }
修改为:
{ "id": 1, "data": "Daniel", "typeID": 1, "type": "Name" }
我的控制器代码:
[HttpGet("{data}")] public async Task<IActionResult> GetOne(string data) { Template template =_templateService.GetOne(data); if (template == null) return await Task.FromResult(NotFound($"Not Found: {data}")); return await Task.FromResult(Ok(template)); }
实体类代码:
public sealed class Type { public int ID { get; set; } public string? Name { get; set; } public List<Template> Templates { get; set; } = new(); } public sealed class Template { public int ID { get; set; } public string? Data { get; set; } public int TypeID { get; set; } public Type? Type { get; set; } }
我正在使用Newtonsoft.Json,尝试在Type类的Templates属性上添加[JsonIgnore]但似乎不起作用,请问该如何解决?
解决方案
1. 修正JsonIgnore的命名空间问题
首先确认你使用的是Newtonsoft.Json的JsonIgnore特性,而非System.Text.Json的同名特性——ASP.NET Core默认可能混用两种序列化框架,必须引用正确的命名空间:
using Newtonsoft.Json; public sealed class Type { public int ID { get; set; } public string? Name { get; set; } [JsonIgnore] // 确保是Newtonsoft.Json下的特性 public List<Template> Templates { get; set; } = new(); }
如果项目中同时存在两种序列化配置,需要在Program.cs(或Startup.cs)中明确指定使用Newtonsoft.Json作为默认序列化器:
// .NET 6+ Program.cs builder.Services.AddControllers() .AddNewtonsoftJson();
2. 将Type属性序列化为字符串(取Name值)
要实现把Type对象转为其Name字符串的需求,有两种简洁方案:
方案一:自定义Json转换器
创建针对Type类的序列化转换器:
using Newtonsoft.Json; public class TypeNameConverter : JsonConverter<Type> { public override void WriteJson(JsonWriter writer, Type? value, JsonSerializer serializer) { writer.WriteValue(value?.Name); } public override Type? ReadJson(JsonReader reader, Type objectType, Type? existingValue, bool hasExistingValue, JsonSerializer serializer) { // 若无需反序列化,直接返回null即可 return null; } }
然后在Template类的Type属性上应用该转换器:
public sealed class Template { public int ID { get; set; } public string? Data { get; set; } public int TypeID { get; set; } [JsonConverter(typeof(TypeNameConverter))] public Type? Type { get; set; } }
方案二:添加序列化专用属性
在Template类中新增一个返回Type.Name的属性,并用JsonProperty指定其键为type,同时忽略原Type属性的序列化:
public sealed class Template { public int ID { get; set; } public string? Data { get; set; } public int TypeID { get; set; } [JsonIgnore] // 禁止原Type对象被序列化 public Type? Type { get; set; } [JsonProperty("type")] // 将此属性序列化为"type"字段 public string? TypeName => Type?.Name; }
3. 验证结果
完成上述修改后,接口返回的JSON会自动转换为你需要的格式,同时Templates数组也不会出现在序列化结果中。
内容的提问来源于stack exchange,提问作者Suffix
相关产品推荐
相关产品推荐

