天天看點

再談談ADO.NET Data Service 資料格式(xml和json)

去年的時候,我寫過一篇文章,介紹如何讓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

其實這是内置支援的。去年寫的那個文章是一個做法,本文在此基礎上再一步地澄清一些技術點,給大家參考

為了做示範,我準備了一個簡單的項目

再談談ADO.NET Data Service 資料格式(xml和json)

本例中,我采用LINQ to SQL作為資料模型,通路了Northwind資料庫的Customers表

再談談ADO.NET Data Service 資料格式(xml和json)

同時,我添加了一個最簡單的Data Service

再談談ADO.NET Data Service 資料格式(xml和json)

【備注】以上步驟如果你不清楚,請通過http://msdn.microsoft.com/en-us/library/cc907912.aspx 進行一些基礎的學習

該服務運作起來之後的效果如下

再談談ADO.NET Data Service 資料格式(xml和json)

如果我們通路Customers這個實體集合,則會有下面的結果

再談談ADO.NET Data Service 資料格式(xml和json)

我們看到,它預設是用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 資料格式(xml和json)

監控到的回複如下

再談談ADO.NET Data Service 資料格式(xml和json)

展現在頁面上面的效果如下

再談談ADO.NET Data Service 資料格式(xml和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();
        }
    }
}
           
再談談ADO.NET Data Service 資料格式(xml和json)

至于如何将這個json的字元串轉換為對象進行處理,不是本文讨論的範圍。有興趣可以了解  DataContractJsonSerializer 這個類型。

我可以預見 的是,你真正了解這些之後,會和我一樣的感慨

1.在托管代碼中,盡量用XML,使用LINQ to XML這樣的技術解析資料較為友善

2.在javascript代碼中,盡量用JSON,直接就可以用對象的方式通路。

繼續閱讀