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.
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 –
@snow_FFFFFF Json.Net è il serializzatore predefinito per Web API, ma non per OData (sorprendentemente). OData ha il proprio serializzatore interno. –