Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json.Net在ApiController中序列化派生类而不是基类_C#_Json_Serialization_Asp.net Apicontroller - Fatal编程技术网

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

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

我正在使用MVC ApicController为我的网站创建API

我有一个基类
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)
的返回类型。由于派生类型可能包含某些基类属性的值,可能是为了使对象图完整,因此
序列化
正在考虑派生类型。