杰森网.根据消息字段选择转换器

本文关键字:字段 选择 转换器 消息 | 更新日期: 2023-09-27 18:32:29

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

我有一个应用程序,它侦听传入事件(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;
});

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

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

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

我将非常感谢任何帮助。

杰森网.根据消息字段选择转换器

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

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