使.NET WebApi服务将接收到的JSON反序列化为子对象

本文关键字:JSON 反序列化 对象 WebApi NET 服务 | 更新日期: 2023-09-27 18:16:15

我正在开发的系统使用DataContractJsonSerializer。服务看起来是这样的:

[HttpPost, Route("RunQuery")]
public List<BIResultRecord> RunQuery(BIQuery query) {
    // Logic
}

BIQuery类层次结构如下:

[DataContract]
[KnownType(typeof(BIQuery1))]
public class BIQuery
{
     [DataMember]
     public string Member { get; set; }
     [DataMember]
     public QueryTypeEnum QueryType { get; set; }
}
[DataContract]
public class BIQuery1 : BIQuery
{
    public BIQuery1()
    {
        QueryType = QueryTypeEnum.Type1;
    }
    [DataMember]
    public ClassSpecificObject Object { get; set; }       
}

问题

尽管我将BIQuery1作为json对象发送,但它始终被反序列化(在我的RunQuery方法中(为父对象(BIQuery(。

我尝试了什么

我已经删除了默认的格式化程序,并添加了一个新的:

public class DataContractJsonFormatter : JsonMediaTypeFormatter
{
    public override DataContractJsonSerializer CreateDataContractSerializer(Type type)
    {
        return new DataContractJsonSerializer(type, new DataContractJsonSerializerSettings() { EmitTypeInformation = EmitTypeInformation.AsNeeded });
    }
}

我在.NET中序列化了该对象,以查看JSON结构和将其克隆到请求。我看到它添加了

"__type" : "BIQuery1" 

到JSON,我也在使用它,它什么也没改变。

请帮忙!

更多详细信息

.NET系统(客户端和服务器(按原样在生产环境中运行,因此当前只允许进行微小的更改。我还在制作一个web客户端,它将通过REST.

使.NET WebApi服务将接收到的JSON反序列化为子对象

与现有服务一起工作
[HttpPost, Route("RunQuery")]
public List<BIResultRecord> RunQuery(BIQuery query) {
// Logic
}

RunQuery方法中的参数是BIQuery对象类型的。它被反序列化为BIQuery对象,因为这是您告诉方法它将被传递的类型。如果要将BIQuery1类型的对象传递给方法,请执行以下操作:

[HttpPost, Route("RunQuery")]
public List<BIResultRecord> RunQuery(BIQuery1 query) {
// Logic
}