C# 如何创建通用json反序列化工厂
我有一个将json作为字符串接收的场景。json的每一部分的格式都是相同的,除了其中的一组项。举个简单的例子:C# 如何创建通用json反序列化工厂,c#,.net,json,.net-core,deserialization,C#,.net,Json,.net Core,Deserialization,我有一个将json作为字符串接收的场景。json的每一部分的格式都是相同的,除了其中的一组项。举个简单的例子: { "Type": "A", "Items": [ { "Name": "Item 1" }, { "Name": "Item 2" } ] } 我有以下代码模型来表示这一点: 公共枚举类型 { A、 B } 公共类实例类型A { 公共字符串名称{get;set;} } 公共类实例类型B { 公共int计数器{get;set;}
{
"Type": "A",
"Items": [
{ "Name": "Item 1" },
{ "Name": "Item 2" }
]
}
我有以下代码模型来表示这一点:
公共枚举类型
{
A、 B
}
公共类实例类型A
{
公共字符串名称{get;set;}
}
公共类实例类型B
{
公共int计数器{get;set;}
}
注意:在将来,这些类型将进一步扩展,例如本例中的D、E和F。所有这些都将有一个不同的项目集合结构再次
我想将其反序列化为一个模型,例如:
公共类容器
{
公共类型类型{get;set;}
公共列表项{get;set;}
}
其中T将是instanceTypeA或instanceTypeB
如前所述,我收到顶部显示为字符串的json。“类型”枚举决定了items集合中保存的对象的类型。我正在努力寻找一种非常通用的方法来实现这种序列化
我在想工厂模式可能会有所帮助,但不确定如何实现这一点——有人解决过类似的问题吗
在我的代码中,在实际尝试序列化之前,我碰巧知道它是否是类型A、B等。我可以这样做:
开关(对象类型)
{
案例A:JsonConvert.DeserializeObject(obj.Json)
案例B:JsonConvert.DeserializeObject(obj.Json)
}
这种方法的缺点是调用代码需要知道它处理Container
或Container
等,这根本不是泛型的。我不能让A或B实现一个公共接口,因为它们完全不同。对此有点困惑-我希望工厂模式能有所帮助,但不知道如何-以前有人处理过类似的问题吗
提前感谢您的指点 您不想使用
Type
属性来指定所使用的类型。使用Newtonsoft Json序列化程序时,可以在Json文档中包含对象的类型。这样,当序列化程序反序列化字符串时,它将了解要使用的类型。因此,您可以完全删除Type
属性,只需检查数组中对象的类型。我认为您需要设置传递到序列化程序的settings对象的typenameholling
属性。一旦您看到序列化程序输出带有JSON字符串中的对象的$type
属性,您就知道您做得对。您不想使用type
属性来指定使用的类型。使用Newtonsoft Json序列化程序时,可以在Json文档中包含对象的类型。这样,当序列化程序反序列化字符串时,它将了解要使用的类型。因此,您可以完全删除Type
属性,只需检查数组中对象的类型。我认为您需要设置传递到序列化程序的settings对象的typenameholling
属性。一旦您看到序列化程序输出带有JSON字符串中对象的$type
属性,您就知道您做得对了。您可能会引入一个非泛型抽象基类,在这种情况下,来自的技术可以工作。开关本质上是您工厂方法的内容,不是吗?您可能会引入一个非泛型抽象基类,在这种情况下,来自的技术可以工作。开关本质上是您工厂方法的内容,不是吗?
{
"Type": "B",
"Items": [
{ "Counter": 1 },
{ "Counter": 2 }
]
}