1

我可以動態關閉和啓用數據合約屬性嗎?實質上,我想要兩個數據合同,一個在第三方和我的應用程序之間,另一個在我的應用程序和我的客戶端之間 - 而不必管理兩個DTO類。例如,考慮MyDTO:在運行時動態切換適用的DataContract?

[DataContract] 
public class MyDTO 
{ 
    [DataMember(Name = "Lame/3rdParty/Inbound/Key")] 
    public string MyCoolOutboundKey { get; set; } 
} 

我想和ServiceStack.Text反序列化的DTO:

MyDTO dto = "{\"Lame/3rdParty/Inbound/Key\":\"CoolValue\"}".FromJson<MyDTO>(); 

但是,我想序列化,使這種說法是正確的:

Assert.AreEqual("{\"MyCoolOutboundKey\":\"CoolValue\"}",dto.ToJson()); 

有問題的實際對象擁有百餘性質,所以我希望以避免創建第二類只允許出站序列化。

回答

1

好的 - 這是相當不錯的you cannot change attributes at runtime

,將創建的最終運行圍繞整個問題,將預先處理傳入的JSON,替換鍵根據地圖的替代,即:

Dictionary<String,String> map = new Dictionary<String,String>(); 
map.Add("Lame/3rdParty/Inbound/Key","MyCoolOutboundKey"); 

JsonObject result = new JsonObject(); 
JsonObject obj = jsonObject.Parse("{\"Lame/3rdParty/Inbound/Key\":\"CoolValue\"}"); 

foreach (var entry in obj) 
{ 
    entry.Key = map[entry.Key]; 
    result[entry.Key] = entry.Value; 
} 

Assert.AreEqual("{\"MyCoolOutboundKey\":\"CoolValue\"}",result.ToJson()); 

這樣的唯一數據我要求的合同將是我的應用程序和我的應用程序客戶端之間的合同。

2

所以,你的方法沒有問題,但我認爲你低估了JsonObject的能力,這有點像LINQ to JSON。

我用它來擺脫谷歌地圖的地理數據,並將其映射到一個可愛的小DTO:

var jsonObj = jsonFromGoogleMaps.FromJson<JsonObject>(); 

return (
    from x in jsonObject.Get<JsonArrayObjects>("results") 
    let geo = x.Get("geometry") 
    let loc = geo.Get("location") 
    return new Coords 
    { 
     Lat = x.Get<decimal>("lat"), 
     Lng = x.Get<decimal>("lng"), 
    } 
).FirstOrDefault(); 
+0

這是一個甜蜜的例子。我喜歡。然而,鑑於我有超過100個屬性,並不是所有這些屬性都需要映射到新的鍵上(例如,像「貨幣」這樣的鍵都可以,但「開放/關閉」必須映射) - 我仍然喜歡維護地圖並更換密鑰。也就是說,如果你有與JsonObject'強大的功能相關的鏈接,請將它們傳遞給它們。昨天是我第一次遇到'JsonObject',我想了解更多關於如何最佳利用它的信息。 – 2013-05-10 16:25:51