2011-10-03 147 views
5

有谁知道如何将json字符串从asp.net转换成DataTable?我开始了解Deserialize,它需要这个类,我只是想返回数据表。任何人都可以告诉我如何将其转换为数据表?如何将json转换为数据表?

回答

15

假设你的JSON字符串是对象的列表,每个对象将对应的行中的数据表,即:

public DataTable DerializeDataTable() 
    { 
     const string json = @"[{""Name"":""AAA"",""Age"":""22"",""Job"":""PPP""}," 
          + @"{""Name"":""BBB"",""Age"":""25"",""Job"":""QQQ""}," 
          + @"{""Name"":""CCC"",""Age"":""38"",""Job"":""RRR""}]"; 
     var table = JsonConvert.DeserializeObject<DataTable>(json); 
     return table; 
    } 

这需要Json.NET framework

如果您的JSON结构不同,请发布它。最好的祝福。

+0

您是否找到解决方案?我面临同样的问题。 '输入字符串格式不正确。请勿在Latitude Co lumn中存储<6.94127>。预期的类型是Int64'。我正在使用Newtonsoft.Json.dll。任何解决方案 – Piraba

+0

内置DataTable不会序列化列信息,它必须从数据中推断列类型。我在这里创建了一个改进的转换器https://github.com/chris-herring/DataTableConverter –

0

我不知道你正在使用的JSON库,但你可能想看看JSON.NET因为有叫有一个转换的对象类型是:

Newtonsoft.Json.Converters.DataTableConverter 
    // Summary: 
    //  Converts a System.Data.DataTable to and from JSON. 

我没用过此功能之前,但你可以有一个去与它。

0

这很简单。

如果你在框架2.0中,你必须在你的项目中导入json.net(http://json.codeplex.com/),如果你的框架比较高级,它有json。

在vb.net框架2.0的代码:

Dim Table DataTable 

Table = Json.JsonConvert.DeserializeObject(Of DataTable)(Json_string) 

That's所有。

+0

要小心json.net(http://json.codeplex.com/),并不尊重table.tablename和主键。你必须在转换分贝后进行分析。 – AAP

2

这个问题是过时的,但有人可能正在寻找答案,所以在这里。 它没有与旧JSON.NET,但今天我升级到最新版本和中提琴!它效果很好。

已将DataTable序列化为Json来回,零问题!这是一个很棒的新功能。

希望它可以帮助其他人。干杯。

5
using Newtonsoft.Json; 

string json = "[{"clientID":"1788","projectID":"19"},{"clientID":"1789","projectID":"24"},{"clientID":"1790","projectID":"24"},{"clientID":"1790","projectID":"23"},{"clientID":"1790","projectID":"21"}]"; 

DataTable tester = (DataTable) JsonConvert.DeserializeObject(json, (typeof(DataTable))); 

代码上面的方法

public object Deserialize(string jsonText, Type valueType) 
{ 
    try 
    { 
     Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer(); 

     json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
     json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace; 
     json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore; 
     json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

     StringReader sr = new StringReader(jsonText); 

     Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr); 
     object result = json.Deserialize(reader, valueType); 
     reader.Close(); 
     return result; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 


} 

反序列化jsonstring一些类

List<User> UserList = JsonConvert.DeserializeObject<User>(jsonString); 

写下面的扩展方法到项目

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;   
} 

调用扩展方法一样

UserList.ToDataTable<User>(); 
+0

我正在尝试使用上面的扩展方法 - 构建时没有错误。但我确实收到编译错误:“编译器错误消息:CS0121:以下方法或属性之间的调用不明确:'ExtensionHelpers.ToDataTable <_Default.Jobs>(System.Collections.Generic.IList <_D efault.Jobs> )'和'ExtensionHelpers.ToDataTable <_Default.Jobs>(System.Collections.Generic.IList <_D efault.Jobs>)'“你有什么想法可能会导致它? –