Tôi có một lớp chứa Danh sách các DynamicObject. Tôi có một bài kiểm tra đơn vị xác nhận rằng Newtonsoft Json Serializer/Deserializer xử lý chính xác điều này. Tuy nhiên, mặc định OData Json Serializer/Deserializer thì không.Làm cách nào để thay thế bộ đệm Json Serializer OData V4 mặc định bằng Json Serializer của NewtonSoft?
tôi thực hiện ODataEdmTypeDeserializer của riêng tôi như thế này:
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;
}
}
cùng với nó là 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;
}
}
}
Những hoạt động chính xác, tuy nhiên khi tôi đã cố gắng để tạo ra thực hiện Serialize riêng của tôi, tôi chạy vào một rào cản :
public class JsonODataEntityTypeSerializer : ODataEntityTypeSerializer
{
public JsonODataEntityTypeSerializer(ODataSerializerProvider serializerProvider)
: base(serializerProvider)
{
}
public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
{
}
WriteObject gets được gọi khi bộ điều khiển của tôi cố gắng trả về đối tượng được đề cập, nhưng tôi không chắc phải làm gì ở đây để chèn bộ nối tiếp Newtonsoft. Tôi đã tải xuống mã nguồn OData và xem qua nó nhưng tôi không thấy các móc tôi cần.
Như tôi. Dưới đứng đó, json.net là serializer mặc định - http://stackoverflow.com/questions/20371040/am-i-using-datacontractjsonserializer-or-the-json-net-one-in-my-web-api-2 –
@snow_FFFFFF Json.Net là serializer mặc định cho Web API, nhưng không phải cho OData (đáng ngạc nhiên). OData có bộ nối tiếp nội bộ riêng. –