c# - 如何用 NewtonSoft 的 Json Serializer 替换 OData V4 默认的 Json Serializer?

标签 c# serialization json.net odata deserialization

我有一个包含动态对象列表的类。我有一个单元测试可以确认 Newtonsoft Json Serializer/Deserializer 可以正确处理这个问题。但是,默认的 OData Json Serializer/Deserializer 没有。

我像这样实现了自己的 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;
    }
}  

连同它的 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;
        }
    }
}

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

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

    }

当我的 Controller 试图返回有问题的对象时,WriteObject 被调用,但我不确定在这里要做什么来插入 Newtonsoft Serializer。我下载了 OData 源代码并查看了它,但没有看到我需要的 Hook 。

最佳答案

您必须创建自定义 DataWriter,例如 NewtonsoftJsonDataWriter:ODataWriter。

看看那里:tutorial-sample-odatalib-custom-payload-format

在示例中,它是一个 Csv 写入器,我认为您随后可以使用简单的 Json.Convert() 覆盖其方法 WriteStart、WriteHeader、WriteEntry 和 WriteEnd。

关于c# - 如何用 NewtonSoft 的 Json Serializer 替换 OData V4 默认的 Json Serializer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33353775/

相关文章:

c# - .net 中的 [] 括号是什么?

c# - 带有双重检查锁的单例设计模式

.net - 我们可以在wcf中使用net tcp绑定(bind)进行Json序列化吗?

c# - 序列化时如何为循环值设置null

c# - 通用树到 JSON

c# - 日期值不正确 : for column 'Date' at row 1?

c# - 为什么不针对字段优化简单属性?

Javascript 将表单序列化为 JSON

java - 使用可序列化接口(interface)可以进行选择性序列化吗?

c# - 如何使用 Newtonsoft Json.Net 反序列化接口(interface)