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

使用JsonSerializer.Serialize时控制器仅返回派生类字段问题

问题原因及解决方案

原因

你手动调用JsonSerializer.Serialize(CollectedEditionToGets)时,CollectedEditionToGets的编译时类型为IEnumerable<ICollectedEditionToGet>。System.Text.Json默认依据编译时的接口类型执行序列化,只会序列化该接口直接定义的Notes属性,不会自动识别实际对象(CollectedEditionToGetModel)的父类BaseCollectedEditionModel中实现的Id、Title、Volume属性。

解决方案

方案1:移除手动序列化,直接返回对象

ASP.NET Core的Ok()方法会自动完成对象序列化,默认会基于对象的运行时类型序列化所有公共属性,包括父类属性:

public async Task<IActionResult> GetCollectedEditionsToGet()
{
    var collectedEditionToGets = await Task.Run(() => _service.TryGet());
    return collectedEditionToGets == null ? BadRequest() : Ok(collectedEditionToGets);
}

方案2:手动序列化时指定运行时类型

若必须手动序列化,可将集合转换为object类型,让序列化器识别实际对象的完整属性:

public async Task<IActionResult> GetCollectedEditionsToGet()
{
    var collectedEditionToGets = await Task.Run(() => _service.TryGet());
    if (collectedEditionToGets == null)
    {
        return BadRequest();
    }
    var json = JsonSerializer.Serialize(collectedEditionToGets.Cast<object>());
    return Ok(json);
}

方案3:用特性声明接口的派生类型

在ICollectedEditionToGet接口上添加JsonDerivedType特性,明确告知序列化器该接口的实际实现类型,确保序列化时包含所有属性:

[JsonDerivedType(typeof(CollectedEditionToGetModel))]
public interface ICollectedEditionToGet : IBaseCollectedEdition
{
    public string? Notes { get; set; }
}

之后即可正常使用手动序列化:

public async Task<IActionResult> GetCollectedEditionsToGet()
{
    var collectedEditionToGets = await Task.Run(() => _service.TryGet());
    return collectedEditionToGets == null ? BadRequest() : Ok(JsonSerializer.Serialize(collectedEditionToGets));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:35:11