因為專案需求,需要把原本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 
Tom  Chen 
 Amy Lin 

report

r_id  s_id  subject  score 
Math  80 
English  90
Math  86
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

arrow
arrow
    全站熱搜

    Johnny 鋼鍊 發表在 痞客邦 留言(4) 人氣()