Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建通用json反序列化工厂_C#_.net_Json_.net Core_Deserialization - Fatal编程技术网

C# 如何创建通用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;}

我有一个将json作为字符串接收的场景。json的每一部分的格式都是相同的,除了其中的一组项。举个简单的例子:

{ 
    "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 }
    ]
}