Json .net。根据消息字段选择转换器

时间:2016-01-30 12:27:52

标签: c# json serialization json.net

我可能有一个奇怪的用例,如果我的问题可以用另一种方式解决,也会非常感激。

我有一个应用程序,可以监听传入的事件(json消息)并根据消息类型调用一些代码。它看起来像这样:

_queue.Subscribe(message =>
{
    var obj = JsonConvert.DeserializeObject<T>(message, _serializationSettings);

    lock (this)
    {
        var type = obj.GetType();
        typeof(IEventStorage)
              .GetMethod(nameof(IEventStorage.ProcessEvent))
              .MakeGenericMethod(type)
              .Invoke(EventsStorage, new[] { obj });
    }

    return true;
});

这里我将传入的消息反序列化为我的app数据类型,然后根据此类型调用ProcessEvent方法,该签名如下所示:

void ProcessEvent<TEvent>(TEvent dto) where TEvent : IEvent;

一切都很棒,直到我需要修改我的数据类型,以便现在我必须使用自定义转换器来读取传入的json。现在,我在DeserializeObject中遇到问题,因为Newtonsoft json无法理解使用转换器反序列化的必要性。在我的消息中,我有$type成员,我可以用它来选择正确的转换器进行反序列化,但我无法理解,如何在转换器或合同解析器中指定它。

我会非常感激你的帮助。

1 个答案:

答案 0 :(得分:1)

Deserialize<>()超载,接受JsonConverter的集合。每个JsonConverter都有一个方法CanConvert。因此,Deserialize<>()方法将检查您提供的转换器并使用第一个CanConvert

您可以在ConverterCanConvert()中创建一个返回true的ReadJson(),它会检查消息并决定反序列化策略(可能使用您已经创建的类) )