2011-10-03 72 views
5

誰もがasp.netからjsonの文字列をDataTableに変換する方法を知っていますか? Deserializeについて知るようになりました。クラスが必要です。返されるデータテーブルが必要です。誰も私にそれをdatatableに変換する方法を教えてもらえますか?jsonをdatatableに変換するには?

答えて

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構造が異なる場合は、投稿してください。宜しくお願いします。私が使用していない

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

+0

解決策を見つけましたか?私は同じ問題に直面しています。 '入力文字列の形式が正しくありません。<6.94127>をLatitude Co列に格納できませんでした。予想されるタイプはInt64です。私はNewtonsoft.Json.dllを使用しています。任意のソリューションですか? – Piraba

+0

Builtin DataTableは列情報をシリアル化せず、データから列の種類を推測する必要があります。私はここで改善されたコンバータを作成しましたhttps://github.com/chris-herring/DataTableConverter –

0

私はあなたが使用しているJSONライブラリを確認していないが、あなたは、コンバータのオブジェクトタイプがあるとしてそこにJSON.NETを見てみたいかもしれませんが、これを呼ばれます前にこの機能を使用することができますが、あなたはそれを持って行くことができます。

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と主キーを尊重しません。あなたはdbを変換した後にそれを噛んでください。 – 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; 
    } 


} 

プロジェクトに拡張メソッド

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

のようなコール拡張メソッド、次のいくつかのクラス

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

書くためにあなたのjsonstringをデシリアライズ

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>) '"それを引き起こしている可能性はありますか? –

関連する問題