abstract:最近在開發(fā)Windows8 Metro App,使用JavaScript和HTML開發(fā)環(huán)境。所以操作數(shù)據(jù)綁定都是使用JSON格式數(shù)據(jù)。后臺(tái)使用的是ASP.NET,因?yàn)轫?xiàng)目相對(duì)較小,所有后臺(tái)沒有使用數(shù)據(jù)庫,使用的XML來保存數(shù)據(jù)。前臺(tái)需要請(qǐng)求后臺(tái)返回JSON格式的數(shù)據(jù),比如要求返回一個(gè)eventslist,后臺(tái)操作XML的方法省略。主要討論如何使用Hashtable和ArrayList,然后加上AS
最近在開發(fā)Windows8 Metro App,使用JavaScript和HTML開發(fā)環(huán)境。所以操作數(shù)據(jù)綁定都是使用JSON格式數(shù)據(jù)。后臺(tái)使用的是ASP.NET,因?yàn)轫?xiàng)目相對(duì)較小,所有后臺(tái)沒有使用數(shù)據(jù)庫,使用的XML來保存數(shù)據(jù)。前臺(tái)需要請(qǐng)求后臺(tái)返回JSON格式的數(shù)據(jù),比如要求返回一個(gè)eventslist,后臺(tái)操作XML的方法省略。主要討論如何使用Hashtable和ArrayList,然后加上ASP.NET自帶的JavaScriptSerializer來生成JSON數(shù)據(jù),然后返回給前端使用。當(dāng)然目前微軟的ASP.MVC和ASP.NET Web API在處理JSON格式數(shù)據(jù)有很大的改進(jìn),特別是前端使用Ajax方式post一個(gè)json數(shù)據(jù)給服務(wù)器端,后臺(tái)反序列化一個(gè)對(duì)象,就可以方便實(shí)現(xiàn)后臺(tái)的相關(guān)業(yè)務(wù)邏輯。
代碼如下:
ArrayList eventList = new ArrayList(); for (int i = 0; i < 3;i++ ) { Hashtable ht = new Hashtable(); ht.Add("eventid",i+1); ht.Add("eventname","圣誕節(jié)"); ht.Add("eventdate","2012-12-25"); ht.Add("eventlocation","公司會(huì)議中心"); eventList.Add(ht); } JavaScriptSerializer ser = new JavaScriptSerializer(); String jsonStr=ser.Serialize(eventList); Response.Write(jsonStr);
查看頁面,可以看到返回的結(jié)果是JSON格式的數(shù)據(jù)。實(shí)際上是一個(gè)數(shù)組,數(shù)組里面每項(xiàng)是一個(gè)json對(duì)象。
[{"eventdate":"2012-12-25","eventlocation":"公司會(huì)議中心","eventname":"圣誕節(jié)","eventid":1}, {"eventdate":"2012-12-25","eventlocation":"公司會(huì)議中心","eventname":"圣誕節(jié)","eventid":2}, {"eventdate":"2012-12-25","eventlocation":"公司會(huì)議中心","eventname":"圣誕節(jié)","eventid":3}]
我們可以通過這個(gè)網(wǎng)址驗(yàn)證生成的json是否正確。http://jsonlint.com/
但是我們需要注意的是,hashtable在存放數(shù)據(jù)時(shí)是無序的,所以數(shù)據(jù)并不是按照我們插入的先后順序顯示的。我們可能期望的數(shù)據(jù)格式是:
{"eventid":1","eventname":"圣誕節(jié)",eventdate":"2012-12-25","eventlocation":"公司會(huì)議中心"}
但是我們查看我們的結(jié)果不是這樣的,但是數(shù)據(jù)返回給前端之后,還是要通過JSON.parse()方法轉(zhuǎn)換為json對(duì)象,所以不按照特定的順序,對(duì)我們開發(fā)不影響。
數(shù)據(jù)在HTTP協(xié)議上傳輸都是使用二級(jí)制流,所以數(shù)據(jù)到達(dá)客戶端,需要通過JSON.parse()。我的項(xiàng)目是Windows8 Metro App,當(dāng)然也可以是網(wǎng)頁或者web 應(yīng)用。
當(dāng)然如果前端和后臺(tái)的數(shù)據(jù)模型一致,還可以直接通過對(duì)象實(shí)例直接序列化一個(gè)json格式數(shù)據(jù)。