[ASP]在純ASP中操作陣列產生JSON格式

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

[教學]ASP連接Mysql資料庫

文章引用修改自http://www.xishuiw.com/info/2009-2/2009-2-22-16232.htm

我一開始以為ASP使用資料庫不是連接SQL Server就是Access
(當然我知道可以連接Excel或是csv ….等等之類的,但效率都頗差)

現在教你方法

1.   安裝MySql,應該也都不用自己慢慢裝,還要設定甚麼的
網路上整合包很多,連Appserv或是XAMPP都這麼發達,隨便去裝一個就有了

 

2.  然後到Mysql官網下載MySQL Connector/ODBC 目前版本為5.1
http://dev.mysql.com/downloads/connector/odbc/5.1.html

安裝完,電腦當然沒啥改變,到控制台 > 系統管理工具 > 資料來源 (ODBC) > 驅動程式

來看看有沒有成功安裝 (捲軸往下拉,應該會有Mysql ODBC 5.1 Driver)

3.  建立資料庫,還有資料表,倒入資料(我之後再發文)

3. 使用ASP語法

 

先建立connection物件,內文有中文字的部分要自行修改

connstr=”driver={mysql odbc 5.1 driver};database=資料庫名;server=localhost;uid=使用者名稱;password=密碼;Stmt=Set Names ‘UTF-8′”
set conn = server.createobject(“adodb.connection”)
conn.open connstr

然後是建立Recordset物件

set rs=server.createobject(“adodb.recordset”)
sql=”select * from 資料表名”
rs.open sql,conn,1,2

或者這樣建立Recordset物件

set rs = conn.execute(“select * from 資料表名”)

剩下的用法就跟之前叫Access的用法都一樣了

 

跑不出來時,有幾個重點

1. 請確認是否MySQL Connector/ODBC有安裝成功

2. 資料庫登入的帳號/密碼/主機/資料庫

3. SQL語法有些會與Access的不同,像是資料表名就不用中括號 [ ] 包
等等…請見其用法

4. 看網路上的文章,MySQL Connector 3.51版不支援UTF-8請更新版本

5. 若出現亂碼,請注意資料庫的編碼  和  連線時設定的編碼  與  網頁顯示的編碼  是否都吻合?

 

 

有問題再提出來吧

 

上午 01:00 2009/7/11
目前發現,Mysql不支援ASP本身的分頁功能
(應該定位式資料存取也不支援,看來還是要用Mysql提供的limit語法了…)

rs.AbsolutePage = Page

————————————

像是資料表名就不用中括號 [ ] 包
Emeditor有批次的解決辦法記得勾Regular Expressions
搜尋     \[(.*?)\]
取代     \1\E

[筆記]ASP印出檔案列表(包含子資料夾)的程式

找很久,也終於給我找到了
這可是很多書上沒有寫的喔

FileSystemObject的資料本來就比較少
反正都變成ASP.net了,這種驚訝應該不是很多人能體會吧
因為這些都是ASP.net的基本配備=  =

傳入絕對路徑,會傳回整理過的檔案列表(包含子資料夾)

有興趣的人煩請看程式碼更動,謝謝。

——————————————————————————

<

p>’顯示檔案列表  
Function ShowFileList(folderspec)  
Dim f, f1, fc, s  
Set fso = CreateObject(“Scripting.FileSystemObject”)
If (fso.FolderExists(folderspec)) Then
Set f = fso.GetFolder(folderspec)  

<

p>Set fc = f.SubFolders
For Each f1 in fc  
s = s &”&lt;dir&gt;”& f1.name  
s = s & “<br>”  
Next  

<

p>Set fc = f.Files  
For Each f2 in fc  
s = s & f2.name  
s = s & “<br>”  
Next  
ShowFileList = s  
Else  
ShowFileList = -1  
End if  
End Function