[英]How to create a generic json deserialization factory
我有一个场景,我收到 json 作为字符串。 每块 json 的格式都相同,除了其中的项目集合。 以此作为简化示例:
{
"Type": "A",
"Items": [
{ "Name": "Item 1" },
{ "Name": "Item 2" }
]
}
{
"Type": "B",
"Items": [
{ "Counter": 1 },
{ "Counter": 2 }
]
}
我在代码中有以下模型来表示这一点:
public enum Type
{
A, B
}
public class InstanceTypeA
{
public string Name { get; set; }
}
public class InstanceTypeB
{
public int Counter { get; set; }
}
注意:将来,类型将进一步扩展,例如本例中的 D、E 和 F。 所有这些都将再次具有不同结构的项目集合。
我想将其反序列化为 model,例如:
public class Container<T>
{
public Type Type { get; set; }
public List<T> Items { get; set; }
}
其中 T 可以是 instanceTypeA 或 instanceTypeB
如前所述,我收到了顶部显示的 json 作为字符串。 正是“类型”枚举决定了项目集合中的 object 的类型。 我正在努力寻找一种非常通用的方法来实现这种序列化。
我在想工厂模式可能会有所帮助,但不确定如何实现这一点——有没有人解决过类似的问题。
在我的代码中,在实际尝试序列化之前,我碰巧知道它是 A 型、B 型等。 我可以这样做:
switch(obj.Type)
{
case A: JsonConvert.DeserializeObject<Container<A>>(obj.Json)
case B: JsonConvert.DeserializeObject<Container<B>>(obj.Json)
}
这种方法的缺点是调用代码需要知道它处理Container<A>
或Container<B>
等。这根本不是通用的。 我无法让 A 或 B 实现一个通用接口,因为它们都完全不同。 对此有点困惑-我希望工厂模式可以提供帮助,但看不到如何-以前有没有人处理过类似的问题?
感谢您提前提供任何指示!
您不想使用Type
属性来规定使用什么类型。 使用 Newtonsoft Json 序列化程序时,您可以在 JSON 文档中包含 object 的类型。 这样,当序列化程序反序列化字符串时,它将了解要使用的类型。 所以你可以完全删除Type
属性,只检查数组中 object 的类型。 我相信您需要设置 object 传递到序列化程序的设置的TypeNameHandling
属性。 一旦您看到序列化程序输出$type
属性以及 JSON 字符串中的对象,您就知道您做对了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.