Json.Net在ApiController中序列化派生类而不是基类

本文关键字:基类 派生 序列化 Net ApiController Json | 更新日期: 2023-09-27 17:54:04

我正在使用MVC ApiController为我的网站创建一个API。

我有一个基类ThinDevice,它包含Device的信息子集。在我的API中,我只想序列化属于ThinDevice的属性,但是,尽管我进行了转换,并使用ThinDevice作为返回类型,当我序列化Device时,它总是序列化整个对象

[HttpGet]
public ThinDevice Get(string id)
{
    // This returns Device
    var device = this.dataService.GetDevice(id);
    if (device != null)
    {
        // I only want to serialize properties in ThinDevice
        return device as ThinDevice;
    }
}

Json.Net在ApiController中序列化派生类而不是基类

这种行为是预期的。你可以查看这个问题的详细信息。

选项1:我建议手动创建一个ThinDevice的实例,或者如果这个类是抽象的,那么为响应引入一些单独的模型。

示例:

public class ThinDevice
{
    public string A { get; set; }
}
public class Device1 : ThinDevice
{
    public string B { get; set; }
}
[HttpGet]
public ThinDevice Get()
{
    return GetDeviceResponse(new Device1 { A = "A", B = "B" });
}
private ThinDevice GetDeviceResponse<T>(T device) where T : ThinDevice
{
    return new ThinDevice
    {
        A = device.A
    };
}

这段代码不是很好(特别是如果你有复杂的对象结构)。

选项2:您可以实现自定义JSON和XML序列化,只包含您想要的数据,但这可能很困难。