从动态对象创建对象

时间:2016-08-03 09:23:31

标签: c# dynamic

我有一个包含json的JObject,其结构与我的Device类相同:

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和我的对象不共享相同的结构,部分是这样,所以我不能简单地转换while json。

1 个答案:

答案 0 :(得分: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中很好地运行,显示了结果的Device类,其中包含Detail类列表(2个条目),每个类都有一个Entry类列表(每个条目2个条目),并且设置了kvp。

如果可以,我会走这条路。如果出于某种原因关闭了属性的命名并且您无法更改它,则可以始终使用[JsonProperty("actual_json_name")]覆盖它。

相关问题