2010-10-27 64 views
4

我有一個名爲config.json的文件。下面是它的內容:C#:將JSON原語反序列化爲.NET複雜類型

{ 
    dataSources: 
    [ 
     "http://www.blahblah.com/blah", 
     "http://www.blahblah.com/blah2", 
     ... 
    ], 

    skills: 
    [ 
     { 
      "name": "foobaris", 
      "regex": "pattern" 
     }, 
     ... 
    ] 
} 

我要出這個數據的創建Config對象一樣容易和簡潔越好。 Config被定義爲:

public class Config 
{ 
    public IEnumerable<Uri> DataSources { get; set; } 
    public IEnumerable<KeyValuePair<string, Regex>> Skills { get; set; } 
} 

什麼是最簡單的路線?

因爲Config.DataSourcesUri秒,.SkillsRegex S,我現在必須derserialize(即RawConfig rawConfig = new JavaScriptSerializer().Deserialize<RawConfig>(configFileContents))配置文件到這個結構第一:

public struct RawConfig 
{ 
    public IEnumerable<string> DataSources { get; set; } 
    public IEnumerable<RawConfigSkill> Skills { get; set; } 
} 

public struct RawConfigSkill 
{ 
    public string Name { get; set; } 
    public string Regex { get; set; } 
} 

...然後是結構轉換爲Config (例如new Config(rawConfig))。

我可以無效嗎?

回答

3

我經常看到這種情況。

我們有一些數據需要從文本格式中解析出來,我們有一些工具可以爲我們進行解析,而我們需要在我們自己的某個特定對象圖中得到結果。

這種情況經常發生在json,自定義應用程序配置部分,命令行參數中......這僅僅是爲了舉出一些場景。

在這些情況下,我個人更喜歡將步驟分開。使用工具/庫(在您的情況下,JavaScriptSerializer)將文本解析爲中間對象。然後將中間對象映射到最終對象(換句話說,你已經在做什麼)。

試圖一舉實現它通常會使它比需要更復雜。在一個方法調用下封裝這兩個操作並完成它。

我們只是試圖讓解析工具輸出我們想要的確切對象圖的事實幾乎總是比它的價值更麻煩。

當然,很多事情可以使第二步更簡單 - LINQ到對象表達式,AutoMapper等。