2015-10-26 17 views
7

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.

+0

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 –

+1

@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. –

Trả lời

1

Đã tìm kiếm điều này trước đây, tôi không nghĩ điều đó là có thể. Kinda như nó không thể thêm một serializer XML :-(

Có thể trong Api Web mặc dù

2

Bạn phải tạo một DataWriter tùy chỉnh, ví dụ NewtonsoftJsonDataWriter:. ODataWriter

Có một cái nhìn có : tutorial-sample-odatalib-custom-payload-format

Trong ví dụ nó là một nhà văn Csv đó được thực hiện, tôi nghĩ rằng sau đó bạn sẽ có thể ghi đè phương thức của nó WriteStart, WriteHeader, WriteEntry và WriteEnd với một Json.Convert đơn giản()

Các vấn đề liên quan