WebAPI v2 - OData扩展的JSON序列化导致$ type不正确

时间:2014-06-26 01:10:43

标签: json asp.net-web-api json.net odata

我刚刚将MVC4 / WebApi v1应用程序更新为MVC5 + WebAPI2 ..

似乎在升级之后,Json.Net序列化程序将不再包含使用OData $ expand方法的请求的正确$类型。请参阅下面的一个例子,我的意思是......

正确:

请求:http://url.com/api/Studies/277/Sites

响应:

{
$id: "1"
$type: "LGCYDAPI.Domain.Model.StudySiteWithContacts, LGCYDAPI.Domain.Model"
Contacts: [
{
$id: "2"
$type: "LGCYDAPI.Domain.Model.ContactRelatedToSite, LGCYDAPI.Domain.Model"
ContactID: -38445
}],
SiteID: 38445
}

不正确

请求:http://url.com/api/Studies/277/Sites?$ expand =通讯录

响应:

{
$id: "1"
$type: "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib"
Contacts: [
{
$id: "2"
$type: "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib"
ContactID: -38445
}],
SiteID: 38445}

与MVC和WebAPI程序集一起,我将JSON.NET从5.0.6更新到6.0.3,我认为这是问题..但是,我还原到v5并且它没有解决问题所以我是回到第6节。还更新了OData nugets - 我当前的版本是Microsoft.Data.OData = 5.6.0和Microsoft.AspNet.WebApi.OData = 5.1.2。

JSON序列化程序设置:

pConfiguration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
        pConfiguration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
        pConfiguration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;

        pConfiguration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());

1 个答案:

答案 0 :(得分:1)

响应有效负载中的$ type用于序列化实际对象。

在结果上应用$ expand时,返回对象的结构从LGCYDAPI.Domain.Model.StudySiteWithContacts更改为SelectExpandWrapper

因此,您无法在应用$ expand的情况下获得预期的网站类型。

对于SelectExpandWrapper结构,请检查:

https://aspnetwebstack.codeplex.com/wikipage?title=%24select%20and%20%24expand%20support