[ASP.net WebForm] 利用JSON.net 實現 DataTable轉JSON字串、JSON字串轉DataTable
想不到這篇文章在Google搜尋那麼前面,順便宣傳一下另一篇:[C#.net] 產生JSON字串的幾種方式整理
Json.NET 是一套在Server端處理JSON格式資料的好套件
基本操作在最底下文章已提及
這邊要紀錄的是DataTable和JSON字串之間的互轉(而且Code很少)
要使用Json.NET的話,先到官網:http://json.codeplex.com/
下載紅框處
解壓縮後把Bin\Net資料夾底下的Newtonsoft.Json.dll放到Web Site專案的Bin目錄下即完成加入參考
再來看這次要實驗的資料集
接著開始寫程式
在.aspx設計畫面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:Literal ID="li_showData" runat="server" /><hr />
<asp:Button Text="把DataTable轉成JSON字串" ID="btn_DataTableToJSONstr" runat="server"
OnClick="btn_DataTableToJSONstr_Click" />
<asp:Button Text="把JSON字串轉成DataTable" ID="btn_JSONstrToDataTable" runat="server"
OnClick="btn_JSONstrToDataTable_Click" /><hr />
<!--JSON字串轉成DataTable後要跟GridView1做DataBind()-->
<asp:GridView runat="server" ID="GridView1" />
</form>
</body>
</html>
Code-Behind
DataTable互轉JSON字串,重點只要一行程式碼就夠了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/*要引用以下命名空間*/
using System.Data;
using System.Data.SqlClient;
/*Json.NET相關的命名空間*/
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public partial class _Default : System.Web.UI.Page
{
//DB連線字串
string connStr = @"Data Source=.\sqlexpress;Initial Catalog=NorthwindChinese;Integrated Security=True";
string sql = @"Select CategoryID,CategoryName,Description from Categories
Where CategoryID Between 1 And 5";
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 依據SQL語句,回傳DataTable物件
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
private DataTable queryDataTable(string sql)
{
DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(this.connStr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.Fill(ds);
}
return ds.Tables.Count > 0 ? ds.Tables[0] : new DataTable();
}
//把DataTable轉成JSON字串
protected void btn_DataTableToJSONstr_Click(object sender, EventArgs e)
{
//得到一個DataTable物件
DataTable dt = this.queryDataTable(this.sql);
//將DataTable轉成JSON字串
string str_json = JsonConvert.SerializeObject(dt, Formatting.Indented);
//JSON字串顯示在畫面上
li_showData.Text = str_json;
}
//把JSON字串轉成DataTable或Newtonsoft.Json.Linq.JArray
protected void btn_JSONstrToDataTable_Click(object sender, EventArgs e)
{
//Newtonsoft.Json.Linq.JArray jArray =
// JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JArray>(li_showData.Text.Trim());
//或
DataTable dt = JsonConvert.DeserializeObject<DataTable>(li_showData.Text.Trim());
//GridView1顯示DataTable的資料
//GridView1.DataSource = jArray; GridView1.DataBind();
GridView1.DataSource = dt; GridView1.DataBind();
}
}
執行結果:
使用ADO.net Entity Framework也可以輕鬆互轉JSON字串
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/*自行引用命名空間*/
using NorthwindChineseModel;
using Newtonsoft.Json;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
//把IQueryable轉成JSON字串
protected void btn_EntitySetToJSONstr_Click(object sender, EventArgs e)
{
using (NorthwindChineseEntities entities = new NorthwindChineseEntities())
{
IQueryable categories = from c in entities.Categories
where c.CategoryID >= 1 && c.CategoryID <= 5
select new { c.CategoryID, c.CategoryName, c.Description };
string str_json = JsonConvert.SerializeObject(categories, Formatting.Indented);
//顯示JSON字串
li_showData.Text = str_json;
}
}
//把JSON字串轉成Newtonsoft.Json.Linq.JArray
protected void btn_JSONstrToEntitySet_Click(object sender, EventArgs e)
{
Newtonsoft.Json.Linq.JArray jArry = JsonConvert.DeserializeObject < Newtonsoft.Json.Linq.JArray>(li_showData.Text.Trim());
GridView1.DataSource = jArry; GridView1.DataBind();
}
}
另外
要閱讀JSON字串的話,個人推薦Online JSON Viewer,
把JSON字串貼到Text頁籤的畫面上,可以再按Format排版
也可以再按Viewer進一步察看資料
如果JSON格式不符的話,會跳出一個alert訊息
算是輔助Debug的工具
本文章的專案包
2011.12.01 追加
既然都講到Server端的JSON字串,順便把JSONP字串也補完
if(!string.IsNullOrEmpty(Request.QueryString["callback"]))
{
str_json = Request.QueryString["callback"] + "("+str_json+");";
}//這樣出來的str_json就是JSONP字串了
參考資料:How to convert datatable to json string using json.net?
衍伸閱讀文章:CODE-使用JSON.NET處理動態物件屬性