2011-10-03 228 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>)'「你有什麼想法可能會導致它? –