2012-06-21 36 views
5

Tôi nghĩ rằng sau đây sẽ là một nhiệm vụ khá phổ biến và giả định sẽ có một giải pháp dễ dàng cho nó, nhưng tôi không thể tìm thấy nó.Chuyển đổi DataTable sang JSON bằng khóa trên mỗi dòng

Nếu tôi có dữ liệu trong cấu trúc sau.

ID Name Active 
ID1 John TRUE 
ID2 Bill FALSE 

Tôi muốn serialize nó như là một đối tượng JSON nơi cột ID là một nút trong đối tượng JSON như:

[ 
    { 
     "ID1": { 
      "Name": "John", 
      "Active": "True" 
     }, 
     "ID2": { 
      "Name": "Bill", 
      "Active": "False" 
     } 
    } 
] 

Tôi nhìn vào JSON.NET nhưng không thể làm cho nó làm việc . Chỉnh sửa: Tôi đang sử dụng C#

+0

Điều này sẽ không tự xảy ra. Bạn đang làm việc ở ngôn ngữ nào – lanzz

+0

Hmm phải quên đề cập đến C#, thx. – Arnoldiusss

+2

Bạn đã xem cái này chưa? http://stackoverflow.com/questions/451460/datatable-to-json – Blueberry

Trả lời

20

Điều này khá đơn giản với JSON.NET. Chỉ cần chuyển đổi bảng dữ liệu của bạn vào từ điển tương đương với các từ điển:

public Dictionary<string, Dictionary<string, object>> DatatableToDictionary(DataTable dt, string id) 
{ 
    var cols = dt.Columns.Cast<DataColumn>().Where(c => c.ColumnName != id); 
    return dt.Rows.Cast<DataRow>() 
      .ToDictionary(r => r[id].ToString(), 
          r => cols.ToDictionary(c => c.ColumnName, c => r[c.ColumnName])); 
} 

Sau đó gọi:

JsonConvert.SerializeObject(DatatableToDictionary(dt, "ID"), Newtonsoft.Json.Formatting.Indented); 

Dưới đây là toàn bộ bài kiểm tra:

var dt = new DataTable("MyTable"); 
dt.Columns.Add("ID"); 
dt.Columns.Add("Name"); 
dt.Columns.Add("Active"); 

dt.LoadDataRow(new[] {"ID1", "John", "True"}, true); 
dt.LoadDataRow(new[] {"ID2", "Bill", "False"}, true); 

JsonConvert.SerializeObject(DatatableToDictionary(dt, "ID")); 

Và kết quả:

{ 
    "ID1": { 
    "Name": "John", 
    "Active": "True" 
    }, 
    "ID2": { 
    "Name": "Bill", 
    "Active": "False" 
    } 
} 
+0

Cảm ơn, phương pháp trợ giúp tuyệt vời! thanx cho ví dụ hoàn chỉnh. – Arnoldiusss

0

Sử dụng JSON.NET (Newtonsoft.Json.Linq)

var obj = new JObject(
    dataTable.Rows.Cast<DataRow>() 
     .Select(r => new JProperty(r["ID"].ToString(), 
       new JObject(
        new JProperty("Name", r["Name"].ToString()), 
        new JProperty("Active", r["Active"].ToString()) 
       ) 
      )) 
); 

// Convert the JObject to a JSON string 
var json = obj.ToString(); 
Các vấn đề liên quan