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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:27:46