2015-10-26 12 views
7

Ho una classe che contiene un elenco di DynamicObjects. Ho un test unitario che conferma che Newtonsoft Json Serializer/Deserializer lo gestisce correttamente. Tuttavia, il serializzatore/deserializzatore OData Json predefinito non lo fa.Come sostituire il serializzatore Json predefinito OData V4 con Json Serializer di NewtonSoft?

ho implementato il mio ODataEdmTypeDeserializer in questo modo:

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

insieme con la sua 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; 
     } 
    } 
} 

Questi funzionano correttamente, tuttavia quando ho cercato di creare la mia propria implementazione Serialize mi sono imbattuto in un posto di blocco :

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

    } 

WriteObject ottiene chiamato quando il mio controller tenta di restituire l'oggetto in questione, ma non sono sicuro di cosa fare qui per inserire il serializzatore Newtonsoft. Ho scaricato il codice sorgente OData e l'ho guardato, ma non vedo i ganci di cui ho bisogno.

+0

Come ho. sotto stand it, json.net è il serializzatore predefinito - http://stackoverflow.com/questions/20371040/am-i-using-datacontractjsonserializer-or-the-json-net-one-in-my-web-api-2 –

+1

@snow_FFFFFF Json.Net è il serializzatore predefinito per Web API, ma non per OData (sorprendentemente). OData ha il proprio serializzatore interno. –

risposta

1

Cercato prima, non credo sia possibile. Un po 'come non è possibile aggiungere un serializzatore XML :-(

E' possibile in Api Web se

2

È necessario creare un DataWriter personalizzato, ad esempio NewtonsoftJsonDataWriter:. ODataWriter

Dai un'occhiata lì : tutorial-sample-odatalib-custom-payload-format

nell'esempio è uno scrittore Csv che viene realizzato, penso che sarete quindi in grado di sovrascrivere i suoi metodi WriteStart, WriteHeader, WriteEntry e WriteEnd con un semplice Json.Convert()

Problemi correlati