我有一個包含DynamicObjects列表的類。我有一個單元測試,確認Newtonsoft Json串行器/解串器能正確處理這個問題。但是,默認的OData Json串行器/解串器不會。如何用NewtonSoft的Json串行器替換OData V4默認的Json串行器?
我實現我自己的ODataEdmTypeDeserializer這樣的:
public class JsonODataEdmTypeDeserializer : ODataEdmTypeDeserializer
{
public JsonODataEdmTypeDeserializer(ODataPayloadKind payloadKind) : base(payloadKind)
{
}
public JsonODataEdmTypeDeserializer(ODataPayloadKind payloadKind, ODataDeserializerProvider deserializerProvider) : base(payloadKind, deserializerProvider)
{
}
public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
{
var data = readContext.Request.Content.ReadAsStringAsync().Result;
//Call to the NewtonSoft Deserializer
var ret = JsonConvert.DeserializeObject(data, type);
return ret;
}
}
與它的DefaultODataDeserializerProvider沿:
public class JsonODataDeserializerProvider : DefaultODataDeserializerProvider
{
public override ODataEdmTypeDeserializer GetEdmTypeDeserializer(IEdmTypeReference edmType)
{
var kind = GetODataPayloadKind(edmType);
return new JsonODataEdmTypeDeserializer(kind, this);
}
private static ODataPayloadKind GetODataPayloadKind(IEdmTypeReference edmType)
{
switch (edmType.TypeKind())
{
case EdmTypeKind.Entity:
return ODataPayloadKind.Entry;
case EdmTypeKind.Primitive:
case EdmTypeKind.Complex:
return ODataPayloadKind.Property;
case EdmTypeKind.Collection:
IEdmCollectionTypeReference collectionType = edmType.AsCollection();
return collectionType.ElementType().IsEntity() ? ODataPayloadKind.Feed : ODataPayloadKind.Collection;
default:
return ODataPayloadKind.Entry;
}
}
}
這些正常工作,但是當我試圖創建自己的序列化的實現我遇到了一個路障:
public class JsonODataEntityTypeSerializer : ODataEntityTypeSerializer
{
public JsonODataEntityTypeSerializer(ODataSerializerProvider serializerProvider)
: base(serializerProvider)
{
}
public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
{
}
WriteObject gets當我的控制器試圖返回有問題的對象時調用,但我不確定在這裏插入Newtonsoft串行器的操作。我下載了OData源代碼並查看了它,但是我沒有看到我需要的鉤子。
正如我。下站在它,json.net是默認的序列化器 - http://stackoverflow.com/questions/20371040/am-i-using-datacontractjsonserializer-or-the-json-net-one-in-my-web-api-2 –
@snow_FFFFFF Json.Net是Web API的默認序列化程序,但不適用於OData(令人驚訝)。 OData有它自己的內部串行器。 –