加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何用NewtonSoft的Json Serializer替换OData V4默认的Jso

发布时间:2020-12-15 07:57:34 所属栏目:百科 来源:网络整理
导读:我有一个包含DynamicObjects列表的类.我有一个单元测试,确认Newtonsoft Json Serializer / Deserializer正确处理这个问题.但是,默认的OData Json Serializer / Deserializer没有. 我实现了我自己的ODataEdmTypeDeserializer,如下所示: public class JsonODa
我有一个包含DynamicObjects列表的类.我有一个单元测试,确认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,ODataMessageWriter messageWriter,ODataSerializerContext writeContext)
    {

    }

当我的控制器试图返回有问题的对象时,会调用WriteObject,但我不知道该怎么做才能插入Newtonsoft Serializer.我下载了OData源代码并查看了它,但我没有看到我需要的钩子.

解决方法

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

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

在示例中,它是一个实现的Csv编写器,我认为您将能够使用简单的Json.Convert()覆盖其方法WriteStart,WriteHeader,WriteEntry和WriteEnd.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读