[轉貼] 利用JSON.net 實現 DataTable轉JSON字串、JSON字串轉DataTable (程式碼短少)

2012031509:27

出處: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/

image

下載紅框處

解壓縮後把Bin\Net資料夾底下的Newtonsoft.Json.dll放到Web Site專案的Bin目錄下即完成加入參考

 

 

再來看這次要實驗的資料集

image

接著開始寫程式

在.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();
    }


}

 

 

執行結果:

image

使用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排版

image

 

也可以再按Viewer進一步察看資料

image

如果JSON格式不符的話,會跳出一個alert訊息

image

算是輔助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處理動態物件屬性

                         好用的JSON Library:Json.NET