2013-08-04 83 views
1

我有一些JSON需要反序列化到類中。該類由一些簡單的getter和setter組成,用於某些屬性。其他屬性是隻讀的,並通過該類上的方法進行初始化。例如:將JSON反序列化爲.NET對象,同時保留封裝

public class ReportDescription 
{ 
    public int Id { get; set; } 
    public int Title { get; set; } 
    public string Group { get; set; } 

    public IEnumerable<Param> RequiredParameters { get; } 
    public IEnumerable<Param> OptionalParameters { get; } 
    public void addParam(Param param) { /* add the param to the internal collection */} 
} 

RequiredParameters屬性返回IEnumerable並且沒有setter。要將必需的參數添加到此對象中,您可以調用addParam執行一些業務邏輯並將該參數添加到對象內部集合中。

我的JSON是這樣的:

[ 
    { 
     "ReportId": 1, 
     "DisplayName": "Report One", 
     "Group": "Group One", 
     "RequiredParameters": [], 
     "OptionalParameters": [], 
    }, 
    { 
     "ReportId": 2, 
     "DisplayName": "Report Two", 
     "Group": "Group Two", 
     "RequiredParameters": ["Param1", "Param2"], 
     "OptionalParameters": [], 
    } 
] 

我怎麼會反序列化JSON這將上述類?

我試圖使用DataContractJsonSerializer,它對於帶有getter和setter的屬性很好,但無法找到一種方法來定製它,以便在JSON中遇到RequiredParameters屬性時調用addParam。有沒有一種直接定製DataContractJsonSerializer序列化的方法?

我考慮過的另一個選擇是使用JSON.NET來瀏覽JSON並手動創建一個新的ReportDescription並調用它的方法。這可能與.NET 3.5中的DataContractJsonSerializer或其他一些開箱即用的類有關嗎?

回答

0

沒有「開箱即用」將打電話給您的非標準addParam。最簡單的事情就是反序列化爲一個「expando」對象(參見各種選項here),然後編寫幾行簡單的C#將事物從該對象移動到實際類型中。