如何将 OData V4 默认的 Json 序列化程序替换为 NewtonSoft 的 Json 序列化程序?



我有一个包含动态对象列表的类。我有一个单元测试来确认Newtonsoft Json序列化器/反序列化器正确地处理了这个问题。但是,默认的OData Json序列化器/反序列化器不会这样做。

我实现了我自己的ODataEdmTypeDeserializer,像这样:

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

和它的defaultodatadesserializer provider:

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

这些工作正确,但是当我试图创建我自己的Serialize实现时,我遇到了一个障碍:

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

WriteObject在我的控制器试图返回有问题的对象时被调用,但是我不确定在这里插入Newtonsoft Serializer该怎么做。我下载了OData源代码并查看了它,但我没有看到我需要的钩子。

您必须创建一个自定义DataWriter,例如NewtonsoftJsonDataWriter:ODataWriter.

查看这里:tutorial-sample- oddatalib -custom-payload-format

在这个例子中,它是一个Csv写入器,我认为你可以用一个简单的Json.Convert()重写它的方法WriteStart, WriteHeader, WriteEntry和WriteEnd。

找这个之前,我不认为这是可能的。有点像不可能添加XML序列化器:-(

)

在Web Api中可以通过

相关内容

  • 没有找到相关文章

最新更新