使用C#中的JsonConvert反序列化具有泛型类型参数的类



我有一个有点复杂的类层次结构,我正试图使用JsonConvert对其进行反序列化。

这是我试图做的一个非常做作的例子。注意:

  • 我不能修改Deserializable类,我必须从它继承
  • 我无法修改反序列化代码本身

namespace Animals {
// cannot modify these
public class Deserializable {}
abstract class Region {}
public class Africa : Region {}
public class America : Region {}
public class Europe : Region {}
public class Australia : Region {}
// can modify these
public abstract class Animal : Deserializable {}
public class Cow<T> : Animal where T : Region {}
public class AngusCow : Cow<Australia> {}
public class AurochCow : Cow<Europe> {}
// I don't know any other cow types
}

我试图反序列化的JSON

[
{ "$type": "Animals.AngusCow, Animals" },
{ "$type": "Animals.AurochCow, Animals" },
]

反序列化选项

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
serializerSettings.TypeNameHandling = TypeNameHandling.Auto;
serializerSettings.Formatting = Formatting.Indented;
serializerSettings.MaxDepth = new int?(50);
serializerSettings.ContractResolver = JsonSerializer.CreateDefault().ContractResolver;

反序列化代码:

var animals = JsonConvert.DeserializeObject<List<Deserializable>>(jsonString, serializerSettings);

我的猜测是Cow<T>部分让它绊倒了,或者可能是Cow<Australia>。我需要在JSON本身中放入什么来解决这个问题吗?我可以在不需要类型参数的情况下编写此代码,但在我的情况下,如果可以的话,我更希望它使用类型参数。

错误是:

Error resolving type specified in JSON 'Animals.AngusCow, Animals'.

这是使用Json.NET库。

我可以确认程序集名称甚至类型名称没有问题,因为在我的实际代码中,json列表中包含了其他"Animals",这些"Cow<T>"没有类型参数,并且当列表中不包括中断类型时,它们可以很好地反序列化。


编辑:经过进一步调查,我从Cow中删除了类型参数。我还是遇到了同样的错误。

举个简单的例子,类层次结构是:

Deserializable > A > B > X: Works
Deserializable > A > B > Y: Works
Deserializable > A > B > Z: Works
Deserializable > A > B > C > D: Does not work
Deserializable > A > B > C > E: Does not work
Deserializable > A > B > C > F: Does not work

其中ABC都是抽象的。

这表明C是一个问题类,然而,C上没有任何字段,因此字段反序列化不会有任何问题。

这是由类名称空间(C#文件中(中的拼写错误引起的。

相关内容

  • 没有找到相关文章

最新更新