http://www.aygfsteel.com/ebecket 返還網(wǎng)
          隨筆-140  評(píng)論-11  文章-131  trackbacks-0

          本文PDF下載

          本文結(jié)構(gòu)

          結(jié)構(gòu)圖

          JSON簡介

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

          客戶端

          使用JSON方式創(chuàng)建對(duì)象

          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

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

          JSON方式

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

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

          alert(p.Age) //輸出25

          可以看出,上述兩種方式創(chuàng)建的對(duì)象實(shí)際上是一樣的,但使用JSON方式創(chuàng)建對(duì)象更簡便,非常適合創(chuàng)建一個(gè)臨時(shí)的用來存儲(chǔ)數(shù)據(jù)的對(duì)象。使用JSON方式創(chuàng)建的對(duì)象是不是與c#的匿名對(duì)象很相似呢?

          為什么說使用JSON方式創(chuàng)建的對(duì)象與c#的匿名對(duì)象很相似,而不是相同呢?因?yàn)樵?/span>C#中,匿名對(duì)象是不能傳遞的,也就是說不能通過參數(shù)的形式傳遞給另一個(gè)方法進(jìn)行處理。但根據(jù)JavaScript語言的特點(diǎn),對(duì)于Object對(duì)象沒有嚴(yán)格的類型限制,這樣就可以進(jìn)行方便的傳遞了:

          function showName(person){

               alert(person.Name);

          }

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

          獲取JSON對(duì)象的字符串表示

          使用json.js可以方便的將對(duì)象轉(zhuǎn)換為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);

              };

          }

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

          引入了這個(gè)js文件后,就可以簡單地調(diào)用toJSONString方法來獲取對(duì)象的JSON字符串形式:

          var jsonStr = p.toJSONString();

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

          將字符串轉(zhuǎn)換為JSON對(duì)象

          在引入了json.js后,可以簡單地調(diào)用JSON.parse(text),或者text.parseJSON()來將字符串轉(zhuǎn)換為對(duì)象,但是需要注意的是,在一個(gè)string對(duì)象上調(diào)用parseJSON()時(shí),會(huì)報(bào)一個(gè)錯(cuò)誤“illegal access,這是因?yàn)樵诖a“return JSON.parse(this, filter);”處,this的類型是一個(gè)Object,這可能是一個(gè)bug,稍加改動(dòng)即可通過:

          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方法的第一個(gè)參數(shù)是string類型的對(duì)象。

          服務(wù)器端

          LINQ to JSON

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

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

          在項(xiàng)目中引用Newtonsoft.Json.dll就可以獲得LINQ to JSON的能力了。在下面的示例中,我使用到了Northwind數(shù)據(jù)庫,使用LINQ to SQL方式讀取所有產(chǎn)品類別數(shù)據(jù),創(chuàng)建一個(gè)JObject對(duì)象:

          using (NorthwindDataContext db = new NorthwindDataContext())

          {

                  JObject json = new JObject( //創(chuàng)建JSON對(duì)象

                  db.Categories.Select(

                      c =>

                      new JProperty( //創(chuàng)建JSON屬性

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

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

                              c.Products.Select(

                                  p =>

                                  p.ProductName

                              )

                          )

                      )

                  )

              );

              ltrJson.Text = json.ToString();

          }

          上述代碼生成的數(shù)據(jù)結(jié)構(gòu)如下:

          類別名稱” : [“產(chǎn)品名稱”, “產(chǎn)品名稱”, “產(chǎn)品名稱”,]

          , “類別名稱” : [“產(chǎn)品名稱”, “產(chǎn)品名稱”, “產(chǎn)品名稱”,]

          ,……

          在前臺(tái)頁面獲取ltrJson.Text,然后調(diào)用JSON.parse(ltrJson.Text),就可以獲取到生成的對(duì)象了。

          可以看出,LINQ to JSON提供程序支持我們以習(xí)慣的LINQ方式讀取、創(chuàng)建對(duì)象,簡化了開發(fā)過程,讓我們的注意力可以集中在業(yè)務(wù)流程上。

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

          LINQ to JSON

          JavaScript

          描述

          JObject

          Object

          對(duì)象

          JProperty

          string

          屬性名

          JArray

          Array

          數(shù)組

          JValue

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

          屬性的值

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

          將字符串轉(zhuǎn)換為JObject對(duì)象

          在后臺(tái)程序中可以通過JObject的靜態(tài)方法Parse將字符串轉(zhuǎn)換為一個(gè)JObject對(duì)象:

          JObject o = JObject.Parse(json);

          轉(zhuǎn)換成功后,就可以利用LINQ to JSON的特性來進(jìn)行相關(guān)操作了。

          LINQ to JSON中的查詢

          要使用LINQ to JSON進(jìn)行查詢,就必須要了解它的數(shù)據(jù)結(jié)構(gòu):

          clip_image002

          可以看出,其所有的類都派生于JToken,也就是說所有的LINQ to JSON對(duì)象都可以用JToken來表示,即JObjectJProperty還是JArray都可以利用李氏替換原則而用JToken來表示。認(rèn)清這一點(diǎn)是非常必要的,因?yàn)榻酉聛淼氖纠袑⒍啻斡玫剿麄冎g的類型轉(zhuǎn)換。

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

          using (ProductDataContext db = new ProductDataContext())

          {

              JObject json = new JObject( //創(chuàng)建JSON對(duì)象

                  db.Categories.Select(

                      c =>

                      new JProperty( //創(chuàng)建JSON屬性

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

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

                              c.Products.Select(

                                  p =>

                                  p.ProductName

                              )

                          )

                      )

                  )

              );

           

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

              {

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

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

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

                  {

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

                  }

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

              }

          上述示例運(yùn)行后,將輸出所有的產(chǎn)品類別,以及屬于對(duì)應(yīng)類別的所有產(chǎn)品信息。

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

          using (ProductDataContext db = new ProductDataContext())

          {

              JObject json = new JObject( //創(chuàng)建JSON對(duì)象

                  db.Categories.Select(

                      c =>

                      new JProperty( //創(chuàng)建JSON屬性

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

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

                              c.Products.Select(

                                  p =>

                                  p.ProductName

                              )

                          )

                      )

                  )

              );

              var q =

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

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

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

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

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

              {

                  Console.WriteLine(i);

              }

          }

           

          LINQ to JSONXmlDocument之間的轉(zhuǎn)換

          使用LINQ to JSON,可以方便地在JSON對(duì)象與XmlDocument對(duì)象間進(jìn)行轉(zhuǎn)換。在以下兩個(gè)示例中,演示了轉(zhuǎn)換過程:

          XmlDocument對(duì)象轉(zhuǎn)換為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字符串轉(zhuǎn)換為XmlDocument對(duì)象

          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

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

          AJAX

          使用AJAX獲取JSON

          在實(shí)際應(yīng)用中,常會(huì)使用Ajax從后臺(tái)程序中獲取數(shù)據(jù),然后呈現(xiàn)在頁面中。在本示例中為了簡化操作,創(chuàng)建了一個(gè)“一般處理程序”(.ashx文件)作為后臺(tái)數(shù)據(jù)的提供程序,然后在頁面中使用Ajax訪問它獲取一個(gè)JSON對(duì)象,然后訪問JSON對(duì)象的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數(shù)據(jù)庫的產(chǎn)品類別表

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

                          .Products //獲取此類別的所有產(chǎn)品

                          .Select(p => p.ProductName) //結(jié)果只包含產(chǎn)品名稱

                          .ToArray(); //轉(zhuǎn)換為數(shù)組

                      //實(shí)例化JObject對(duì)象,同時(shí)為其加入一個(gè)名為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>

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

          本文中使用到的資源

          Northwind數(shù)據(jù)庫下載

          json.js下載

          Newtonsoft.Json.dll下載

          Json.NET資源瀏覽

          轉(zhuǎn)自http://www.cnblogs.com/sunnycoder/archive/2010/03/21/1691008.html

          posted on 2010-03-22 15:31 becket_zheng 閱讀(1230) 評(píng)論(0)  編輯  收藏 所屬分類: 網(wǎng)頁web前端技術(shù)C#
          主站蜘蛛池模板: 遵化市| 南郑县| 临江市| 大庆市| 贵溪市| 龙井市| 芦溪县| 郴州市| 湘西| 台中县| 乡城县| 石楼县| 泾源县| 民乐县| 汾阳市| 明水县| 平湖市| 邳州市| 扬中市| 东宁县| 米林县| 鲜城| 城步| 太康县| 通许县| 余姚市| 车险| 镇安县| 章丘市| 吴江市| 韩城市| 延寿县| 永靖县| 雷山县| 汉沽区| 偃师市| 临澧县| 合江县| 承德市| 穆棱市| 任丘市|