将List转换为DataTable

时间:2014-12-27 15:29:22

标签: c# json datatable

这基本上是我发布的将JSON反序列化到DataTable的上一个问题的后续内容。好了,这个过程快要完了,这就是代码:

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                result = streamReader.ReadToEnd();
                dynamic d = JObject.Parse(result);
            }


           var root = JsonConvert.DeserializeObject<RootObject>(result);




 public static DataTable ToDataTable<T>(this IList<T> data)
    {
        PropertyDescriptorCollection props =
        TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        for (int i = 0; i < props.Count; i++)
        {
            PropertyDescriptor prop = props[i];
            table.Columns.Add(prop.Name, prop.PropertyType);
        }
        object[] values = new object[props.Count];
        foreach (T item in data)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = props[i].GetValue(item);
            }
            table.Rows.Add(values);
        }
        return table;
    }


  public class Record
    {
        public int StatusID { get; set; }
        public string Identifier { get; set; }
        public string Status { get; set; }
        public string StatusDate { get; set; }
        public string WorkedBy { get; set; }
        public string ContactedOn { get; set; }
        public string Email { get; set; }
    }

    public class RootObject
    {
        public  List<Record> Record { get; set; }


    }

现在,反序列化工作正常,但我无法转换为DataTable。我正在使用我在SO中找到的ToDataTable扩展,这段代码应该将我的列表转换为DataTable:

RootObject.Record.ToDataTable<Record>();

现在我当然不能这样做,因为Record不是静态成员,但是如果我把它设为静态,就像这样:

 public static List<Record> record { get; set; }

并将ToDataTable扩展调用更改为

 RootObject.record.ToDataTable<Record>();

它打破了从JSON到List的转换。如果我验证&#34; root&#34;使用断点。 var它的null并且没有数据,所以当它试图将它变成DataTable时,整个事情崩溃,因为它只有空值。

1 个答案:

答案 0 :(得分:3)

您的RootObject包含Record属性,因此您需要使用它来创建DataTable,如下所示:

var root = JsonConvert.DeserializeObject<RootObject>(result);
root.Record.ToDataTable<Record>();

您尝试过将其作为RootObject类的静态成员访问,因为反序列化已经创建了RootObject的实例,因此在此上下文中是错误的。您现在只需使用要转换为Record的{​​{1}}属性。


这就是为什么我认为使用DataTable关键字并不总是好的。有时你会忘记或监督它是什么类型。如果你写了:

var

你可能已经找到了自己的解决方案。