2015-10-26 7 views
7

私はDynamicObjectsのリストを含むクラスを持っています。私はNewtonsoft Jsonシリアライザ/デシリアライザがこれを正しく処理することを確認する単体テストを持っています。ただし、デフォルトのOData Jsonシリアライザ/デシリアライザはサポートしていません。Oton V4のデフォルトのJsonシリアライザをNewtonSoftのJsonシリアライザに置き換えるにはどうすればよいですか?

私はこのように私自身のODataEdmTypeDeserializerを実装:それはDefaultODataDeserializerProviderだと一緒に

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; 
    } 
} 

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

Iとおり。下それを立てて、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

前にこれを見て、私はそれが可能ではないと思います。それはあなたがカスタムDataWriterを作成する必要が

2

けれどもそれは、Web APIで可能です:-(

XMLシリアライザを追加することはできませんちょっとのように、例えばNewtonsoftJsonDataWriter:。ODataWriter

が見てください:tutorial-sample-odatalib-custom-payload-format

の例では、それが実装されているCSVライターだ、私はあなたが単純なJson.Convert()とそのメソッドWriteStart、WriteHeader、WriteEntryとWriteEndを上書きすることができるでしょうと思います

関連する問題