C# Json.Net在ApiController中序列化派生类而不是基类
我正在使用MVC ApicController为我的网站创建API 我有一个基类C# Json.Net在ApiController中序列化派生类而不是基类,c#,json,serialization,asp.net-apicontroller,C#,Json,Serialization,Asp.net Apicontroller,我正在使用MVC ApicController为我的网站创建API 我有一个基类ThinDevice,它包含设备的信息子集。在我的API中,我只想序列化属于ThinDevice的属性,但是,尽管我进行了强制转换,并且在序列化设备时使用ThinDevice作为返回类型,它始终序列化整个对象 [HttpGet] public ThinDevice Get(string id) { // This returns Device var device = this.dataService
ThinDevice
,它包含设备的信息子集。在我的API中,我只想序列化属于ThinDevice
的属性,但是,尽管我进行了强制转换,并且在序列化设备时使用ThinDevice
作为返回类型,它始终序列化整个对象
[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;
}
}
这种行为是意料之中的。您可以查看此项了解详细信息
选项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
};
}
公共类ThinDevice
{
公共字符串A{get;set;}
}
公共类设备1:ThinDevice
{
公共字符串B{get;set;}
}
[HttpGet]
公共物品
{
返回GetDeviceResponse(新设备1{A=“A”,B=“B”});
}
私有ThinDevice获取设备响应(T设备),其中T:ThinDevice
{
退货新设备
{
A=装置A
};
}
这段代码不是很好(特别是当您有复杂的对象结构时)
选项2:您可以实现自定义JSON和XML序列化,只包含您想要的数据,但这可能很困难。这不是预期的吗?我希望它会根据我的返回类型进行序列化。即使我的期望是错误的,我想知道如何做:)可能是您更改了dataService.GetDevice(id)
的返回类型。由于派生类型可能包含某些基类属性的值,可能是为了使对象图完整,因此序列化
正在考虑派生类型。