2012-08-06 58 views
2

我有以下DTO如何將JsonObject實例轉換/反序列化爲具體類?

public class Foo 
{ 
    public ServiceStack.Text.JsonObject Bar { get; set; } 
} 

Foo.Bar可以是一出其他3個DTO的

某處在我的代碼,我想映射/轉換/反序列化Foo.Bar到具體的DTO(我知道ServiceStack.Text.JsonObject工具System.Collection.Generic.Dictionary<string, string> - 有趣的是,作爲非字符串傳輸的值,以字符串形式進入我的ServiceStack.Text.JsonObject-實例)。

所以我試圖

ServiceStack.Text.JsonExtensions.JsonTo<ConcreteDTO>(foo.Bar, ???) 

,但它需要一個鍵選擇作爲第二個參數 - 但我不希望將單個值,而我會去爲整個實例。

我也知道有ServiceStack.Text.JsonExtensions.ConvertTo<T>(JsonObject jsonObject, Func<JsonObject, T> convertFn),但我不想轉換手動編碼的jsonObject。

那麼,我該如何解決這個問題呢?

編輯:
只是要清楚 - 我不想去的彎路和序列化JsonObject -instance爲JSON字符串只是爲了反序列化...有來自JsonObject任何直接的反序列化選項?

回答

1

那麼...我結束了:

DTO concreteDTO; 
var jsonString = JsonSerializer.SerializeToString(foo.Bar); 
switch (foo.ConcreteObjectType) 
{ 
    case ObjectType.Foo1: 
     concreteDTO = jsonString.FromJson<DTO1>(); 
     break; 
    case ObjectType.Foo2: 
     concreteDTO = jsonString.FromJson<DTO2>(); 
     break; 
    case ObjectType.Foo3: 
     concreteDTO = jsonString.FromJson<DTO3>(); 
     break; 
} 
+0

似乎這不是一個非常好的選擇。每次獲得新的具體類型時,都必須添加另一個案例選項。 – ant 2012-11-01 20:21:05

+0

@ant但是這就是工廠/映射器的情況 - 你有什麼其他的機會?鏈接必須知道*某處*,並且每當您引入一個新類型時,您都必須在某處調整* ...如果您爲此註冊表:某些註冊表調用...如果您創建數組與鍵=類型和值=工廠方法:某處是'push'調用...在我的情況下主要問題是:我正在處理'enums' - 如果我有類/複雜類型我可以介紹一些'抽象'/'虛擬'屬性來實現這個工廠......但我正在處理價值......悲傷但真實...... – 2012-11-02 06:50:34

+0

10年後 - 總結 - 你應該使用策略模式方法...... – 2016-05-18 15:56:02

相關問題