2015-10-26 24 views
7

Ich habe eine Klasse, die eine Liste von DynamicObjects enthält. Ich habe einen Komponententest, der bestätigt, dass der Newtonsoft Json Serializer/Deserializer dies richtig handhabt. Der standardmäßige OData Json Serializer/Deserializer funktioniert jedoch nicht.Wie ersetze ich den Standard-Json-Serializer von OData V4 durch den Json-Serializer von NewtonSoft?

ich meine eigenen ODataEdmTypeDeserializer wie folgt umgesetzt:

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

zusammen mit seinem 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; 
     } 
    } 
} 

richtig Diese Arbeit, aber wenn ich versuchte, meine eigene Serialize Implementierung ich in eine Straßensperre lief zu erstellen :

public class JsonODataEntityTypeSerializer : ODataEntityTypeSerializer 
{ 
    public JsonODataEntityTypeSerializer(ODataSerializerProvider serializerProvider) 
     : base(serializerProvider) 
    { 
    } 
public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) 
    { 

    } 

WriteObject wird aufgerufen, wenn mein Controller versucht, das fragliche Objekt zurückzugeben, aber ich bin mir nicht sicher, was ich hier tun soll, um den Newtonsoft Serializer einzufügen. Ich habe den OData-Quellcode heruntergeladen und mich durchgeschaut, aber ich sehe nicht die Haken, die ich brauche.

+0

Wie ich außer Kraft zu setzen. unter stehe es, json.net ist der Standard-Serializer - http://stackoverflow.com/questions/20371040/am-i-using-dataccontractjsonserializer-or-the-json-net-one-in-my-web-api-2 –

+1

@snow_FFFFFF Json.Net ist der Standard-Serializer für Web API, aber nicht für OData (überraschend). OData hat einen eigenen internen Serializer. –

Antwort

1

Ich habe das vorher gesucht, ich glaube nicht, dass es möglich ist. Kinda wie ist es nicht möglich, ein XML-Serializer :-(

Es ist möglich, in Web-Api hinzufügen obwohl

2

Sie haben eine benutzerdefinierte Datawriter, zum Beispiel NewtonsoftJsonDataWriter erstellen. ODataWriter

einen dort Blick : tutorial-sample-odatalib-custom-payload-format

im Beispiel wird ein Csv Schriftsteller es, die implementiert ist, denke ich dann in der Lage sein, Sie werden ihre Methoden WriteStart, WriteHeader, Writeentry und WriteEnd mit einem einfachen Json.Convert()

Verwandte Themen