因為專案需求,需要把原本ASP的資料轉成JSON的格式
我知道ASP是大家動態網頁設計的好夥伴(笑)
(迷之音:ASP都出這麼久了,很多都已經轉成ASP.net了幹嘛這麼執著呢?)
就跟你說是專案需求了嘛(巴落去
這只是我的小小筆記,以免有機會又用上找不到怎麼做
尤其是程式語言對於陣列(Array)的操作方式都不大一樣
我盡量強化大家的JSON概念,盡量不特別提程式碼的部份
——————————–
學JSON格式只有二句話:
物件(object)用大括號 { }
陣列(array)用中括號 [ ]
先記住這概念
——————————–
ASP要使用JSON要下載此元件:
http://code.google.com/p/aspjson/
我們只需要他的ASP JSON (for production) 就好:
寫文的時候是JSON_2.0.4.asp
把他放在你的目錄然後用以下方式引用:
<!–#include file=”JSON_2.0.4.asp”–>
這裡有些範例蠻有用的:
http://code.google.com/p/aspjson/wiki/Samples2
引用部份範例來說明
物件寫法
<%
Dim o1
Set o1 = jsObject()
o1(“name”) = “Tom”
o1(“lastname”) = “Chen”
o1.Flush
%>
顯示
{“name”:”Tom”,”lastname”:”Chen”}
陣列寫法
<%
Dim o2
Set o2 = jsArray()
o2(Null) = 2
o2(Null) = 4
o2(Null) = 6
o2(Null) = 8
o2.Flush
%>
顯示
[2,4,6,8]
———————
所以我們學到,宣告空白變數使用Dim
決定是何種型態使用 Set 這個字
不要小看這個關鍵字,他可是很有用的
最後,當你把資料形態設定為jsObject之後
直接像範例一樣 o(“name”) 直接在括號之中放入新的key值,當成變數來指定
而資料形態設定為jsArray的時候
可以像範例一樣用o2(Null) 的方式增加值
範例集有提到jsArray和jsObject中的對轉,我覺得不是很重要,所以就不引用了
再來看比較tricky的
物件包物件
<%
Dim o3
Set o3 = jsObject()
Set o3(“person”) = jsObject()
o3(“person”)(“name”) = “Tom”
o3(“person”)(“lastname”) = “Chen”
Set o3(“equipment”) = jsObject()
o3(“equipment”)(“name”) = “keyboard”
o3(“equipment”)(“type”) = “electronic”
o3.Flush
%>
顯示
{“person”:{“name”:”Tom”,”lastname”:”Chen”},”equipment”:{“name”:”keyboard”,”type”:”electronic”}}
陣列包陣列
<%
Dim o4
Set o4 = jsArray()
Set o4(Null) = jsArray()
o4(Null)(Null) = 0
o4(Null)(Null) = 2
o4(Null)(Null) = 4
o4(Null)(Null) = 6
Set o4(Null) = jsArray()
o4(Null)(Null) = 1
o4(Null)(Null) = 3
o4(Null)(Null) = 5
o4(Null)(Null) = 7
o4.Flush
%>
顯示
[[0,2,4,6],[1,3,5,7]]
在陣列包陣列的範例中,就會明顯看到
其實程式它是從上到下,照順序執行
雖然 Set o4(Null) = jsArray() 這二行都一樣
但意義不同
難度慢慢增高摟
陣列包物件
<%
Dim o5
Set o5 = jsArray()
Set o5(Null) = jsObject()
o5(Null)(“name”) = “Tom”
o5(Null)(“lastname”) = “Chen”
Set o5(Null) = jsObject()
o5(Null)(“name”) = “Amy”
o5(Null)(“lastname”) = “Lin”
o5.Flush
%>
顯示
[{“name”:”Tom”,”lastname”:”Chen”},{“name”:”Amy”,”lastname”:”Lin”}]
這JSON格式已經接近資料庫撈出來的格式了
物件包陣列
<%
Dim o6
Set o6 = jsObject()
o6(“name”) = “Tom”
o6(“lastname”) = “Chen”
Set o6(“numbers”) = jsArray()
o6(“numbers”)(Null) = 2
o6(“numbers”)(Null) = 4
o6(“numbers”)(Null) = 5
o6(“numbers”)(Null) = 6
o6.Flush
%>
顯示
{“name”:”Tom”,”lastname”:”Chen”,”numbers”:[2,4,5,6]}
———————
最後跳過中間的步驟,直接開最後的大絕!
陣列包物件包陣列包物件
心理OS:哪那麼多陣列物件呀~
<%
Dim o7
Set o7 = jsArray()
Set o7(Null) = jsObject()
o7(Null)(“name”) = “Tom”
o7(Null)(“lastname”) = “Chen”
Set o7(Null)(“report”) = jsArray()
Set o7(Null)(“report”)(Null) = jsObject()
o7(Null)(“report”)(Null)(“subject”)=”Math”
o7(Null)(“report”)(Null)(“score”)=80
Set o7(Null)(“report”)(Null) = jsObject()
o7(Null)(“report”)(Null)(“subject”)=”English”
o7(Null)(“report”)(Null)(“score”)=90
Set o7(Null) = jsObject()
o7(Null)(“name”) = “Amy”
o7(Null)(“lastname”) = “Lin”
Set o7(Null)(“report”) = jsArray()
Set o7(Null)(“report”)(Null) = jsObject()
o7(Null)(“report”)(Null)(“subject”)=”Math”
o7(Null)(“report”)(Null)(“score”)=86
Set o7(Null)(“report”)(Null) = jsObject()
o7(Null)(“report”)(Null)(“subject”)=”English”
o7(Null)(“report”)(Null)(“score”)=88
o7.Flush
%>
顯示
[{“name”:”Tom”,”lastname”:”Chen”,”report”:[{“subject”:”Math”,”score”:80},{“subject”:”English”,”score”:90}]},{“name”:”Amy”,”lastname”:”Lin”,”report”:[{“subject”:”Math”,”score”:86},{“subject”:”English”,”score”:88}]}]
看起來很複雜其實並不然
換成XML的格式就長這樣
<data>
<student>
<name>Tom</name>
<lastname>Chen</lastname>
<report>
<subject>
<name>Math</name>
<score>80</score>
</subject>
<subject>
<name>English</name>
<score>90</score>
</subject>
</report>
</student>
<student>
<name>Amy</name>
<lastname>Lin</lastname>
<report>
<subject>
<name>Math</name>
<score>86</score>
</subject>
<subject>
<name>English</name>
<score>88</score>
</subject>
</report>
</student>
</data>
做成大家看得懂的表格
成績單1
姓名 | Tom Chen |
數學 | 80 |
英文 | 90 |
成績單2
姓名 | Amy Lin |
數學 | 86 |
英文 | 88 |
在回顧一下上面那二個很噁心的寫法
有困難嗎?有任何讓你造成不舒服的感覺嗎?
===============================================
以下內容看不懂就算了,沒關係
最後看看這資料庫的函式QueryToJSON
http://code.google.com/p/aspjson/wiki/SQLtoJSON
FunctionQueryToJSON(dbc, sql)
Dim rs, jsa, col
Set rs = dbc.Execute(sql)
Set jsa = jsArray()
WhileNot(rs.EOF Or rs.BOF)
Set jsa(Null)= jsObject()
ForEach col In rs.Fields
jsa(Null)(col.Name)= col.Value
Next
rs.MoveNext
Wend
SetQueryToJSON= jsa
EndFunction
如果上面都看懂的話,只是把欄位名稱和值,用For each印出來,放進jsObject裡而已
rs.Fields就是取得recordset的欄位物件,用
col.Name 取得欄位名
col.Value 取得值
若我資料庫有張表
student
s_id | name | lastname |
1 | Tom | Chen |
2 | Amy | Lin |
report
r_id | s_id | subject | score |
1 | 1 | Math | 80 |
2 | 1 | English | 90 |
3 | 2 | Math | 86 |
4 | 2 | English | 88 |
是不是我們的資料庫就可以這樣寫呢?
sql = “select * from student”
Set rs = dbc.Execute(sql)
Set jsa = jsArray()
While Not (rs.EOF Or rs.BOF)
Set jsa(Null) = jsObject()
For Each col In rs.Fields
jsa(Null)(col.Name) = col.Value
Next
sql2 = “SELECT subject,score FROM report WHERE s_id=”&rs(“s_id”)
Set rs2 = dbc.Execute(sql2)
Set jsa(Null)(“report”) = jsArray()
While Not (rs2.EOF Or rs2.BOF)
Set jsa(Null)(“report”)(Null) = jsObject()
For Each col2 In rs2.Fields
jsa(Null)(“report”)(Null)(col2.Name) = col2.Value
Next
rs2.MoveNext
Wend
rs.MoveNext
Wend