2015-10-26 69 views
7

我有一個包含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源代碼並查看了它,但是我沒有看到我需要的鉤子。

+0

正如我。下站在它,json.net是默認的序列化器 - http://stackoverflow.com/questions/20371040/am-i-using-datacontractjsonserializer-or-the-json-net-one-in-my-web-api-2 –

+1

@snow_FFFFFF Json.Net是Web API的默認序列化程序,但不適用於OData(令人驚訝)。 OData有它自己的內部串行器。 –

回答

1

以前看過這個,我不認爲這是可能的。有點兒像它不可能添加一個XML序列化:-(

有可能在網絡API雖然

2

你必須創建一個自定義DataWriter,例如NewtonsoftJsonDataWriter:ODataWriter

看一看那裏:tutorial-sample-odatalib-custom-payload-format

在它的一個CSV作家被實現,我想,那麼你就能夠覆蓋其方法WriteStart,WriteHeader,WriteEntry和WriteEnd用一個簡單的Json.Convert()的例子