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