我有一个有点复杂的类层次结构,我正试图使用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
其中A
、B
和C
都是抽象的。
这表明C
是一个问题类,然而,C
上没有任何字段,因此字段反序列化不会有任何问题。
这是由类名称空间(C#文件中(中的拼写错误引起的。