【问题标题】:Make .NET WebApi service deserialize recieved JSON as child object使 .NET Web Api 服务反序列化接收 JSON 作为子对象
【发布时间】:2016-11-03 17:23:14
【问题描述】:

我正在开发的系统正在使用 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 客户端。

【问题讨论】:

    标签: c# .net json rest serialization


    【解决方案1】:
    [HttpPost, Route("RunQuery")]
    public List<BIResultRecord> RunQuery(BIQuery query) {
    // Logic
    }
    

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

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

    【讨论】:

    • 这是故意的。此服务已按原样与 .NET 生产客户端一起使用。此外,RunQuery 内部的逻辑是通用的,所以我不想为每个孩子复制它。
    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多