【发布时间】:2020-03-14 09:28:39
【问题描述】:
我有一个场景,我将 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。所有这些都将再次具有不同结构的项目集合。
而我想把它反序列化成一个模型,例如:
public class Container<T>
{
public Type Type { get; set; }
public List<T> Items { get; set; }
}
其中 T 可以是 instanceTypeA 或 instanceTypeB
如前所述,我收到顶部显示的 json 作为字符串。它是“类型”枚举,它决定了项目集合中保存的对象的类型。我正在努力寻找一种非常通用的方法来实现这种序列化。
我认为工厂模式可以提供帮助,但不确定如何实现 - 有没有人解决过类似的问题。
在我的代码中,在实际尝试序列化之前,我碰巧知道它是 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 实现一个通用接口,因为它们都完全不同。对此有点困惑 - 我希望工厂模式可以提供帮助,但看不到如何 - 以前有没有人处理过类似的问题?
提前感谢您的任何指点!
【问题讨论】:
-
你可能会引入一个非泛型抽象基类,在这种情况下Json.Net Serialization of Type with Polymorphic Child Object 的技术可以工作。
-
开关本质上是你工厂方法的内容,不是吗?
标签: c# .net json .net-core deserialization