2016-08-03 239 views
-1

我有一個包含JSON具有相同的結構,我的設備類JObject:從動態對象創建對象

public class Entry 
    { 
     public string key { get; set; } 
     public object value { get; set; } 
    } 

    public class Detail 
    { 
     public List<Entry> entry { get; set; } 
    } 


    public class Device 
    { 
     public List<Detail> details { get; set; } 
    } 

我保存爲動態的JSON:

dynamic d = JsonConvert.DeserializeObject(json); 

我想創建一個從動態對象設備對象:

new Device { details = d.details } 

我不能簡單地做這樣的,因爲細節是一個包含列表一個列表,列表必須用一個構造函數創建,我無法弄清楚如何做到這一點。應該是什麼樣的?

new Device { details = new List<Detail> (entry = new List<Entry>(some list from d?))}} 

請指教我。

編輯:

的JSON和我的對象不共享相同的結構,這部分呢,所以我不能簡單地轉換,而JSON。

+0

爲什麼不直接反序列化爲條目?使用var entry = JsonConvert.DeserializeObject (string json); – bedane

+0

這不完全相同,它分享相似性,它只是這個細節屬性,我創建我的實際對象時遇到問題。 它在對象中的差不多1000個屬性,所以我不能在這裏發佈它。 –

+0

你爲什麼使用'dynamic'?反序列化完整對象,無論它是具體類型。如果它們都包含'List ',那麼只需將一個屬性的值分配給另一個屬性即可。 – Sinatr

回答

1

如果您的JSON具有與Device類完全相同的結構,那麼您應該只能使用JsonConvert.DeserializeObject<Device>(jsonString)

即使原始JSON有一些更多的屬性,只要你的類具有相同的屬性名稱,什麼是數組就是一個數組等等,它應該工作。

樣品:

public class Entry 
    { 
     public string key { get; set; } 
     public object value { get; set; } 
    } 

    public class Detail 
    { 
     public List<Entry> entry { get; set; } 
    } 


    public class Device 
    { 
     public List<Detail> details { get; set; } 
    } 

void Main() 
{ 
    var json = @" 
    { 
     ""irrelevant"": ""fnord"", 
     ""also_irrelevant"": [1,3,5,7], 
     ""details"": [ 
     { 
     ""not_entry"": true, 
     ""entry"": [ 
      { 
      ""key"": ""x"", 
      ""value"": ""1"" 
      }, 
      { 
      ""key"": ""y"", 
      ""value"": ""2"" 
      } 
     ] 
     }, 
     { 
     ""entry"": [ 
      { 
      ""key"": ""a"", 
      ""value"": ""3"", 
      ""bummer"": ""hello"" 
      }, 
      { 
      ""key"": ""b"", 
      ""value"": ""4"", 
      ""bummer"": ""hello"" 
      } 
     ] 
     } 
     ] 
    }"; 

    Newtonsoft.Json.JsonConvert.DeserializeObject<Device>(json).Dump(); 
} 

這很好地運行爲我LINQPad,顯示出得到的設備類,詳細類(2個條目),每個條目類的列表的列表(各2個條目),以kvp的集合。

如果可以,我會走這條路。如果由於某些原因,屬性的命名已關閉且無法更改,則始終可以使用[JsonProperty("actual_json_name")]來覆蓋它。

+0

它不完全一樣,它共享相似性,它只是這個細節屬性,我創建我的實際對象時遇到問題。 它在對象中的差不多1000個屬性,所以我不能在這裏發佈它。 –