<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    http://www.tkk7.com/ebecket 返還網
    隨筆-140  評論-11  文章-131  trackbacks-0

    本文PDF下載

    本文結構

    結構圖

    JSON簡介

    JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它易于編程人員閱讀和編寫,同時也易于機器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。

    客戶端

    使用JSON方式創建對象

    Object方式

    function Person(name, age){

         this.Name = name;

         this.Age = age;

    }

     

    var p = new Person("Sunny D.D", 25);

    alert(p.Name) //輸出Sunny D.D

    alert(p.Age) //輸出25

    使用上述代碼創建對象,需要先寫出對象的類,使用new關鍵字來創建對象。下面將介紹JSON創建對象的方式,它更像C#中的匿名類。

    JSON方式

    var json = {"Name":"Sunny D.D", "Age":25};

    alert(p.Name) //輸出Sunny D.D

    alert(p.Age) //輸出25

    可以看出,上述兩種方式創建的對象實際上是一樣的,但使用JSON方式創建對象更簡便,非常適合創建一個臨時的用來存儲數據的對象。使用JSON方式創建的對象是不是與c#的匿名對象很相似呢?

    為什么說使用JSON方式創建的對象與c#的匿名對象很相似,而不是相同呢?因為在C#中,匿名對象是不能傳遞的,也就是說不能通過參數的形式傳遞給另一個方法進行處理。但根據JavaScript語言的特點,對于Object對象沒有嚴格的類型限制,這樣就可以進行方便的傳遞了:

    function showName(person){

         alert(person.Name);

    }

    showName(json) //輸出Sunny D.D

    獲取JSON對象的字符串表示

    使用json.js可以方便的將對象轉換為JSON的字符串形式。下載地址

    json.js文件的最下面,可以看到這樣一段代碼:

    if (!Object.prototype.toJSONString) {

        Object.prototype.toJSONString = function (filter) {

            return JSON.stringify(this, filter);

        };

        Object.prototype.parseJSON = function (filter) {

            return JSON.parse(this, filter);

        };

    }

    可以看到,它將判斷對象類型是否有toJSONString這樣一個方法,如果沒有,將會為對象加入toJSONString方法與parseJSON這兩個方法。

    引入了這個js文件后,就可以簡單地調用toJSONString方法來獲取對象的JSON字符串形式:

    var jsonStr = p.toJSONString();

    輸出jsonStr,可以獲得字符串"{"Name":"Sunny D.D","Age":25}"

    將字符串轉換為JSON對象

    在引入了json.js后,可以簡單地調用JSON.parse(text),或者text.parseJSON()來將字符串轉換為對象,但是需要注意的是,在一個string對象上調用parseJSON()時,會報一個錯誤“illegal access,這是因為在代碼“return JSON.parse(this, filter);”處,this的類型是一個Object,這可能是一個bug,稍加改動即可通過:

    if (!Object.prototype.toJSONString) {

        Object.prototype.toJSONString = function (filter) {

            return JSON.stringify(this, filter);

        };

        Object.prototype.parseJSON = function (filter) {

            return JSON.parse(this + "", filter);

        };

    }

    這樣就可以確保傳遞給JSON.parse方法的第一個參數是string類型的對象。

    服務器端

    LINQ to JSON

    獲取LINQ to JSON的開源資源,可以訪問http://json.codeplex.com/

    如果僅使用,可以下載Newtonsoft.Json.dll

    在項目中引用Newtonsoft.Json.dll就可以獲得LINQ to JSON的能力了。在下面的示例中,我使用到了Northwind數據庫,使用LINQ to SQL方式讀取所有產品類別數據,創建一個JObject對象:

    using (NorthwindDataContext db = new NorthwindDataContext())

    {

            JObject json = new JObject( //創建JSON對象

            db.Categories.Select(

                c =>

                new JProperty( //創建JSON屬性

                    c.CategoryName, //屬性名稱(在這里是產品類別名稱)

                    new JArray( //屬性的值(在這里是該類別下的所有產品名稱)

                        c.Products.Select(

                            p =>

                            p.ProductName

                        )

                    )

                )

            )

        );

        ltrJson.Text = json.ToString();

    }

    上述代碼生成的數據結構如下:

    類別名稱” : [“產品名稱”, “產品名稱”, “產品名稱”,]

    , “類別名稱” : [“產品名稱”, “產品名稱”, “產品名稱”,]

    ,……

    在前臺頁面獲取ltrJson.Text,然后調用JSON.parse(ltrJson.Text),就可以獲取到生成的對象了。

    可以看出,LINQ to JSON提供程序支持我們以習慣的LINQ方式讀取、創建對象,簡化了開發過程,讓我們的注意力可以集中在業務流程上。

    下面簡單地介紹LINQ to JSON中常用的幾個類。

    LINQ to JSON

    JavaScript

    描述

    JObject

    Object

    對象

    JProperty

    string

    屬性名

    JArray

    Array

    數組

    JValue

    string,number,object,array,true,false,null

    屬性的值

    使用LINQ to JSON創建的對象,都可以簡單地調用ToString方法來獲取JSON字符串。此方法有兩個重載形式,第一個是無參形式,可以按照默認格式獲取JSON字符串;也可以調用有參格式,使用自定義格式來生成JSON字符串。

    將字符串轉換為JObject對象

    在后臺程序中可以通過JObject的靜態方法Parse將字符串轉換為一個JObject對象:

    JObject o = JObject.Parse(json);

    轉換成功后,就可以利用LINQ to JSON的特性來進行相關操作了。

    LINQ to JSON中的查詢

    要使用LINQ to JSON進行查詢,就必須要了解它的數據結構:

    clip_image002

    可以看出,其所有的類都派生于JToken,也就是說所有的LINQ to JSON對象都可以用JToken來表示,即JObjectJProperty還是JArray都可以利用李氏替換原則而用JToken來表示。認清這一點是非常必要的,因為接下來的示例中將多次用到他們之間的類型轉換。

    遍歷一個JToken中所包含的元素,可以使用JTokenObj. Children方法,例如:

    using (ProductDataContext db = new ProductDataContext())

    {

        JObject json = new JObject( //創建JSON對象

            db.Categories.Select(

                c =>

                new JProperty( //創建JSON屬性

                    c.CategoryName, //屬性名稱(在這里是產品類別名稱)

                    new JArray( //屬性的值(在這里是該類別下的所有產品名稱)

                        c.Products.Select(

                            p =>

                            p.ProductName

                        )

                    )

                )

            )

        );

     

        foreach (JProperty i in json.Children()) //遍歷JSON對象的所有屬性

        {

            Console.WriteLine("類別為{0}的產品列表", i.Name); //輸出屬性的名稱

            JArray arr = (JArray)i.Value; //獲取屬性的值(在這里是該類別下的所有產品名稱)

            foreach (JValue j in arr) //遍歷產品名稱集合

            {

                Console.WriteLine(j.Value); //輸出產品名稱

            }

            Console.WriteLine("-----------------------------------------------------");

        }

    上述示例運行后,將輸出所有的產品類別,以及屬于對應類別的所有產品信息。

    既然講LINQ to JSON,那么就可以在其所有的對象上使用LINQ to Object(標準查詢操作符)的方式進行查詢。在下面的示例中,演示了如何使用LINQ to Object(標準查詢操作符)的方式對JSON對象進行查詢:

    using (ProductDataContext db = new ProductDataContext())

    {

        JObject json = new JObject( //創建JSON對象

            db.Categories.Select(

                c =>

                new JProperty( //創建JSON屬性

                    c.CategoryName, //屬性名稱(在這里是產品類別名稱)

                    new JArray( //屬性的值(在這里是該類別下的所有產品名稱)

                        c.Products.Select(

                            p =>

                            p.ProductName

                        )

                    )

                )

            )

        );

        var q =

            json.Children<JProperty>() //獲取JSON對象的所有屬性

            .Where(j => j.Name.StartsWith("C")) //結果只包含屬性名稱以"C"開頭的

            .OrderBy(j => ((JArray)j.Value).Count) //以屬性的值中包含的元素個數排序

            .Select(j => j.Name); //查詢結果僅包含屬性名稱

        foreach (string i in q) //遍歷并輸出屬性名稱

        {

            Console.WriteLine(i);

        }

    }

     

    LINQ to JSONXmlDocument之間的轉換

    使用LINQ to JSON,可以方便地在JSON對象與XmlDocument對象間進行轉換。在以下兩個示例中,演示了轉換過程:

    XmlDocument對象轉換為JSON字符串

    string xml = @"<?xml version=""1.0"" standalone=""no""?>

                    <root>

                      <person id=""1"">

                      <name>Alan</name>

                      <url>http://www.google.com</url>

                      </person>

                      <person id=""2"">

                      <name>Louis</name>

                      <url>http://www.yahoo.com</url>

                      </person>

                    </root>";

    XmlDocument xdoc = new XmlDocument();

    xdoc.LoadXml(xml);

    string jsonText = JsonConvert.SerializeXmlNode(xdoc);

    Console.WriteLine(jsonText);

    JSON字符串轉換為XmlDocument對象

    string json = @"{

                  ""?xml"": {

                    ""@version"": ""1.0"",

                    ""@standalone"": ""no""

                  },

                  ""root"": {

                    ""person"": [

                      {

                        ""@id"": ""1"",

                        ""name"": ""Alan"",

                        ""url"": ""http://www.google.com""

                      },

                      {

                        ""@id"": ""2"",

                        ""name"": ""Louis"",

                        ""url"": ""http://www.yahoo.com""

                      }

                    ]

                  }

                }";

    XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);

     

    LINQ to JSON & LINQ to XML

    在本文前面的討論中,已經包含了JSON字符串、LINQ to JSON對象和XmlDocument之間的轉換方法,那么LINQ to JSON LINQ to XML之間也是可以互相操作的。但是其具體操作方法及是否必要將在以后討論,大家也可以進行試驗。

    AJAX

    使用AJAX獲取JSON

    在實際應用中,常會使用Ajax從后臺程序中獲取數據,然后呈現在頁面中。在本示例中為了簡化操作,創建了一個“一般處理程序”(.ashx文件)作為后臺數據的提供程序,然后在頁面中使用Ajax訪問它獲取一個JSON對象,然后訪問JSON對象的AllProducts屬性:

    Command/GetProductsByCategoryIDHandler.ashx文件:

    <%@ WebHandler Language="C#" Class="GetProductsByCategoryIDHandler" %>

     

    using System;

    using System.Web;

    using System.Linq;

    using Newtonsoft.Json.Linq;

     

    public class GetProductsByCategoryIDHandler : IHttpHandler {

       

        public void ProcessRequest (HttpContext context) {

            HttpResponse response = context.Response;

            HttpRequest request = context.Request;

            int categoryID = Int32.Parse(request["categoryID"]); //傳遞過來的類別ID

            JObject json = null;

            using (NorthwindDataContext db=new NorthwindDataContext())

            {

                string[] productNames =

                    db.Categories //訪問Northwind數據庫的產品類別表

                    .Single(c => c.CategoryID == categoryID) //根據ID獲取唯一實例

                    .Products //獲取此類別的所有產品

                    .Select(p => p.ProductName) //結果只包含產品名稱

                    .ToArray(); //轉換為數組

                //實例化JObject對象,同時為其加入一個名為AllProducts的屬性

                json = new JObject(

                    new JProperty("AllProducts", new JArray(productNames))

                );

            }

            response.ContentType = "text/plain";

            response.Write(json.ToString());

        }

     

        public bool IsReusable {

            get {

                return false;

            }

        }

     

    }

    頁面代碼:

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <title>JsonAjax Demo</title>

        <script type="text/javascript" src="CommonFiles/JavaScript/jQuery/jquery-1.4.js"></script>

        <script type="text/javascript" src="CommonFiles/JavaScript/json.js"></script>

        <script type="text/javascript">

            var commandLocation = "Command/GetProductsByCategoryIDHandler.ashx";

            function getProductsByStandard(categoryID) {

                $.ajax({

                    url: commandLocation,

                    dataType: "json",

                    data: "categoryID=" + categoryID,

                    success: function(json) {

                        show.innerHTML = json.AllProducts;

                    }

                })

            }

        </script>

    </head>

    <body>

        <div>

            <span id="show"></span>

        </div>

    </body>

    </html>

    然后,在腳本中調用getProductsByStandard(1),就會在頁面中顯示類別ID1的所有產品的產品名稱了。要顯示其他類別的產品,只需要改變getProductsByStandard方法的參數即可。

    本文中使用到的資源

    Northwind數據庫下載

    json.js下載

    Newtonsoft.Json.dll下載

    Json.NET資源瀏覽

    轉自http://www.cnblogs.com/sunnycoder/archive/2010/03/21/1691008.html

    posted on 2010-03-22 15:31 becket_zheng 閱讀(1227) 評論(0)  編輯  收藏 所屬分類: 網頁web前端技術C#
    主站蜘蛛池模板: 久久精品国产精品亚洲艾草网| 免费看黄视频网站| 国产vA免费精品高清在线观看| 看亚洲a级一级毛片| 久久综合亚洲色hezyo| 国产精品无码亚洲精品2021| 337P日本欧洲亚洲大胆精品| 日日摸日日碰夜夜爽亚洲| 亚洲AV无码一区二区三区鸳鸯影院| 国产偷国产偷亚洲清高APP| 婷婷亚洲综合五月天小说在线| 日本亚洲中午字幕乱码| 色老头综合免费视频| 一个人看的免费视频www在线高清动漫 | 免费中文熟妇在线影片| 无码国产精品一区二区免费I6| 成全视频免费高清| 国产一级淫片a视频免费观看| 免费在线观看你懂的| 在线精品亚洲一区二区三区| 久久亚洲综合色一区二区三区| 亚洲AV日韩AV天堂一区二区三区| 久久精品a亚洲国产v高清不卡| 亚洲伊人色一综合网| 色窝窝亚洲av网| 一个人免费观看视频在线中文| 人妻免费一区二区三区最新| 在线免费中文字幕| 免费高清在线影片一区| 免费人成网站在线高清 | 免费能直接在线观看黄的视频| 91在线视频免费播放| 午夜亚洲福利在线老司机| 亚洲精品中文字幕乱码三区| 亚洲国产午夜电影在线入口| 色婷婷六月亚洲综合香蕉| 国产无限免费观看黄网站| 四虎在线视频免费观看视频| 免费欧洲美女牲交视频| 亚洲国产精品VA在线看黑人| 亚洲av午夜精品无码专区|