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

时间:2016-11-03 17:23:14

标签: c# .net json rest serialization

我正在开发的系统正在使用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系统(客户端和服务器)按原样在生产中运行,因此目前只允许进行少量更改。我正在制作一个可以通过REST使用现有服务的Web客户端。

1 个答案:

答案 0 :(得分:0)

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

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

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