2013-11-02 34 views
0

我已經搜索了我的問題的解決方案很長一段時間了,並且看到了一些我認爲可能會解決的想法,但是我沒有能夠把它全部一起。值得一提的是,我對C#很陌生。Json反序列化到一個子類的「新」屬性

我有一個庫,它定義了一堆用於反序列化JSON數據的模型類。其中一種型號是Application,它具有屬性public List<ApplicationField> Fields { get; set; }

我已經能夠創建一個應用程序的子類,我稱其爲MyApplication。因爲我有MyApplication我也想有MyApplicationField延伸ApplicationField

我已經嘗試了一些方法和下面的是,我認爲有成功的最佳機會(不幸的是,沒有)的一個:

JsonConvert.DeserializeObject<MyApplication> 

我希望的JSON Fields屬性的值將被映射到類型的字段屬性:

public class MyApplication : Application 
{ 
    new public List<MyApplicationField> Fields { get; set; } 
} 

將JSON然後被反序列化代碼,我已在我的子類MyApplication中定義。然而,反序列化到基類的Fields財產(這是List<ApplicationField>型)

注:我不能夠改變基類。

是否有可能實現我正在尋找的行爲?

+0

你的問題有一些衝突的數據。 MyApplication.Fields是List的MyApplicationField還是MyApplicationField? –

+0

我的錯誤,我錯過了當我總結的帖子的代碼:)現在更新! – Anders

回答

1

適用於我,作爲默認行爲。你能提供一個example來證明這個問題嗎?

void Main() 
{ 
    { 
     var jsonData = @"{""Fields"":[{""MyProp"":""my prop value"",""Prop1"":""prop 1 value""}]}"; 
     var myApp = JsonConvert.DeserializeObject<MyApplication>(jsonData); 
     Console.WriteLine(myApp.Fields[0].MyProp); // "my prop value" 
     Console.WriteLine(((Application)myApp).Fields == null); // "True" 
    } 
    { 
     // just to make sure it's not being clever because "MyProp" is specified 
     // we'll try this also, which could be deserialized as an Application 
     var jsonData = @"{""Fields"":[{""Prop1"":""prop 1 value""}]}"; 
     var myApp = JsonConvert.DeserializeObject<MyApplication>(jsonData); 
     Console.WriteLine(myApp.Fields[0].Prop1); // "prop 1 value" 
     Console.WriteLine(((Application)myApp).Fields == null); // "True" 
    } 
} 

public class MyApplication : Application 
{ 
    public new List<MyApplicationField> Fields { get; set; } 
} 
public class Application 
{ 
    public List<ApplicationField> Fields { get; set; } 
} 
public class MyApplicationField : ApplicationField 
{ 
    public string MyProp { get; set; } 
} 
public class ApplicationField 
{ 
    public string Prop1 { get; set; } 
} 
+0

謝謝你的回答。我將嘗試您提供的示例,然後嘗試確定您的示例和我的代碼之間的任何不一致。我會回來的結果! – Anders

+0

我發現我正在實現的庫的源代碼在Github上可用。應用程序類可以在這裏找到:https://github.com/kasperbumbech/Podio.API-for-.NET/blob/master/Podio.API/Model/Application.cs顯然bas類將json屬性映射到新的名字,我想這就是導致我的問題。我嘗試在我的子類中使用'[DataMember(Name =「fields」,IsRequired = false)]'但語法無法識別。我不確定使用哪個指令來使用。我試過沒有運氣的System.Runtime.Serialization。任何想法? – Anders

+0

嗯......我沒有在我的項目中定義參考:$。現在一切正常。謝謝你幫助我! – Anders