2016-08-03 149 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个属性,所以我不能在这里发布它。 –