簡體   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