去年的時候,我寫過一篇文章,介紹如何讓ADO.NET Data Service傳回json資料格式。如果有興趣,可以參考下面這個連結
http://www.cnblogs.com/chenxizhang/archive/2010/10/27/1862898.html
近日被網友問起,為什麼這個成熟的架構(ADO.NET Data Service, 現在新版本裡面叫WCF Data Service),居然還需要用自定義的Behavior來改變這種輸出格式。
事實上,我認為這個問題問得很好,有些事情多問幾個為什麼,真相将會顯現。
那麼,我們來多問幾個問題
1. 什麼是json
json的全稱是指Javascript object notation, 這種資料格式顧名思義,是用于Javascript的一種原生的資料格式,它一方面較之xml或者html,有體積小的優點,同時它最适合javascript對其進行解析和處理
2. 為什麼ADO.NET Data Service需要支援json
ADO.NET Data Service作為一種服務,它可能被廣泛用于各種業務場景,我們可能通過用戶端程式來通路它,也可能通過javascript來通路它。既然希望在javascript中通路該服務,那麼最好是能支援json格式。
3. ADO.NET Data Service如何支援json
其實這是内置支援的。去年寫的那個文章是一個做法,本文在此基礎上再一步地澄清一些技術點,給大家參考
為了做示範,我準備了一個簡單的項目
本例中,我采用LINQ to SQL作為資料模型,通路了Northwind資料庫的Customers表
同時,我添加了一個最簡單的Data Service
【備注】以上步驟如果你不清楚,請通過http://msdn.microsoft.com/en-us/library/cc907912.aspx 進行一些基礎的學習
該服務運作起來之後的效果如下
如果我們通路Customers這個實體集合,則會有下面的結果
我們看到,它預設是用XML(準确地說,是用Atom)格式傳回資料的。
好吧,我們回到原始的問題,那麼如何傳回json格式的資料呢?http://www.cnblogs.com/chenxizhang/archive/2010/10/27/1862898.html 這篇文章确實提供了一個做法,但事實上真的需要這麼做嗎?
既然我們是要在javascript中通路服務,才需要json格式的資料,那麼我們就用javascript來通路一下該服務,看看到底會怎麼樣?
下面的例子,我用了最喜歡的jquery來編寫腳本
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
$(function () {
var url = "NorthwindService.svc/Customers";
$.getJSON(url, null, function (data) {
var table = $("<table />");
$(data.d).each(function () {
var tr = $("<tr />");
$("<td />").text(this.CompanyName).appendTo(tr);
tr.appendTo(table);
});
table.appendTo($("#jsonHolder"));
});
});
</script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<div id="jsonHolder">
<!--這裡通過json請求的方式讀取Data Service,并且進行布局-->
</div>
</asp:Content>
也就是說,我們隻要在jquery中通過getJSON方法發起請求就可以了。通過Fiddler工具監控,我們看到Request裡面其實有一個格式設定:application/json
監控到的回複如下
展現在頁面上面的效果如下
如此看來,ADO.NET Data Service内置就是支援json格式的,重點就在于用戶端發起請求的時候,指定需要傳回json格式即可。
那麼,我們可以将話題再延伸一下,如果在一個普通的用戶端程式中,也想傳回json格式的資料的話,該怎麼辦呢?
其實也很簡單,我們可以在發起請求的時候,指定要使用json格式傳回資料,如下是一個簡單的例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
var url = "http://localhost:9458/NorthwindService.svc/Customers";
var client = new WebClient();
client.Headers.Add("Accept:application/json");
client.DownloadStringCompleted += (s, a) =>
{
Console.WriteLine(a.Result);
};
client.DownloadStringAsync(new Uri(url));
Console.Read();
}
}
}
至于如何将這個json的字元串轉換為對象進行處理,不是本文讨論的範圍。有興趣可以了解 DataContractJsonSerializer 這個類型。
我可以預見 的是,你真正了解這些之後,會和我一樣的感慨
1.在托管代碼中,盡量用XML,使用LINQ to XML這樣的技術解析資料較為友善
2.在javascript代碼中,盡量用JSON,直接就可以用對象的方式通路。