繁体   English   中英

如何创建一个通用的 json 反序列化工厂

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM