有什么方法可以反序列化派生类而不在我的模型中创建对Json.NET的依赖关系?

时间:2019-12-02 08:06:05

标签: c# .net json.net

我有一个干净的可再发行模型,其中包含许多派生类。为了清楚起见,请参见下面的示例。

class Foo
{
...
}

class BarA:Foo
{
...
}

class BarB:Foo
{
...
}

为了将这些类从Json反序列化为正确的类(例如BarA,而不仅仅是Foo),我通过继承JsonConverter创建了自己的转换器。它非常适合我的应用程序,但这要求其他使用此库的人编写自己的转换器。我不想将转换器包含到我的模型中,因为这将创建对JSON.NET的依赖关系,并且当使用该解决方案的解决方案中的项目具有不同版本的JSON.NET时,从那里就会崩溃。

是否有任何干净的方法可以做到这一点,而又不会污染纯.NET模型?

2 个答案:

答案 0 :(得分:1)

如果您不使用序列化属性,则您的POCO对JSON.Net没有任何依赖。 (至少不要在OP中执行此操作)。调用反序列化器时,可以将可用转换器的列表传递给Deserialize方法。您可以在服务中包装对JSON.Net的依赖关系,但在POCO之外始终会对JSONConverter保持某种依赖关系

伪C#

JsonConvert.DeserializeObject<YourPOCO>(yourJsonString, new YourFancyConverter()) 

twig test

答案 1 :(得分:0)

基于Georgi Georgievs的答案,我创建了一个单独的服务库,该服务库通过选择正确的转换器来处理所有反序列化。该库既有优势,也有缺陷:

  1. 想要使用该模型的应用程序可以反序列化,而无需编写任何其他代码或逻辑来处理反序列化过程。
  2. 除系统名称空间外,POCO模型没有任何依赖项。
  3. 服务库依赖于JSON.NET。如果存在问题,开发人员仍然可以选择编写自己的转换器。但是,POCO模型仍然可以使用,如果我在POCO DLL中具有对JSON.NET的依赖关系,则不会是这种情况。