出處:http://www.dotblogs.com.tw/shadow/archive/2011/11/30/60083.aspx
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處理動態物件屬性