2017-02-22 126 views
2

我試圖更改我的應用程序,以便在爲某些數據發出AJAX請求時輸出JSON而不是HTML。我有一個ADODB記錄集。我需要循環遍歷它並添加/更改/刪除不同的值。然後我需要將所有修改的行和response.write它們作爲JSON。我正在使用JSON2.asp,所以我的應用程序已經支持JSON.parse & JSON.stringify但我無法得到它吐出多維數組作爲JSON。將ADODB.RecordSet輸出爲JSON

set rs = conn.execute(strQuery) 
if Not rs.EOF Then 
    rsArray = rs.GetRows() 'This pulls in all the results of the RecordSet as a 2-dimensional array 
    columnCount = ubound(rsArray,1) 
    rowCount = ubound(rsArray,2) 
    For rowIndex = 0 to rowCount 'Loop through rows as the outer loop 
     rsArray(3,0) = "somethingelse" 
    Next 'Move on to next row if there is one 

    response.write JSON.stringify(rsArray) & " _______ " 
End If 

我只需要能夠通過我的數據庫查詢的結果,修改結果,然後輸出JSON格式的修改結果。什麼是正確的方法來做到這一點?

回答

2

JSON2.asp實現不具有「負荷數據庫」功能,這意味着你將不得不實施一些東西到ADODB.Recordset轉換成JSON結構自己。

如果您願意使用不同的腳本,則在GitHub上有一個實現方案RCDMK,它有一個LoadRecordset()方法,它被稱爲JSON object class 3.5.3

這使得從ADODB.Recordset加載數據非常簡單。

<!-- #include virtual="/jsonObject.class.asp" --> 
<% 
Response.LCID = 2057 
'... 
Dim rs: Set rs = conn.execute(strQuery) 

Dim JSON: Set JSON = New JSONobject 
Call JSON.LoadRecordset(rs) 
Call Response.Clear() 
Response.ContentType = "application/json" 
Call JSON.Write() 
%> 

代碼已經被使用斷開連接的記錄測試,這裏的...表示假定代碼來設置您的記錄,連接等

值得一提的,你可以寫自己,這是不是一個巨大的通過跳轉到ADODB.Recordset並構建JSON字符串。但是,我會因爲幾個原因而反對。

  1. 這是一個耗時的練習。
  2. 很容易錯過(例如在生成輸出時檢查數字數據類型)
  3. 根據編碼方式的不同,可能會使維護(例如,如果不直接從記錄集註入屬性名稱,而是選擇「硬編碼」它們),會變得很尷尬
  4. 爲什麼reinvent the wheel?處理這裏提出的問題有很多公開的實現。無可否認,有些人比其他人好,但需要五分鐘才能包括他們並試一試。

只是爲了完整性這裏是使用斷開連接的記錄

<!-- #include virtual="/jsonObject.class.asp" --> 
<% 
Call init() 

Sub init() 
    Dim fields: fields = Array(Array("title", adVarChar, 50), Array("firstname", adVarChar, 50), Array("lastname", adVarChar, 50), Array("age", adInteger, 4)) 
    Dim rs: Set rs = Server.CreateObject("ADODB.Recordset") 
    Call InsertRow(rs, fields, Array("Mr", "Joe", "Bloggs", 31)) 
    Call InsertRow(rs, fields, Array("Mr", "John", "Smith", 42)) 

    Response.LCID = 2057 

    Dim JSON: Set JSON = New JSONobject 
    Call JSON.LoadRecordset(rs) 
    Call Response.Clear() 
    Response.ContentType = "application/json" 
    Call JSON.Write() 
End Sub 

Sub InsertRow(ByVal rs, fields, values) 
    With rs 
    If rs.State <> adStateOpen Then 
     For Each fld In fields 
     Call .Fields.Append(fld(0), fld(1), fld(2)) 
     Next 

     .CursorLocation = adUseClient 
     .CursorType = adOpenDynamic 
     Call .Open() 
    End If 
    Call .AddNew() 
    For i = 0 To UBound(fields, 1) 
     .Fields(fields(i)(0)).Value = values(i) 
    Next 
    Call .Update() 
    Call .MoveFirst() 
    End With 
End Sub 
%> 

輸出我的本地測試代碼:

{"data":[{"title":"Mr","firstname":"Joe","lastname":"Bloggs","age":31},{"title":"Mr","firstname":"John","lastname":"Smith","age":42}]} 
+0

你可以在調用'JSON.Write()'之前顯示一個實際編輯記錄集的例子嗎?我似乎無法弄清楚如何循環瀏覽JSON並將字段移除/添加到每個「行」。在實際循環LoadRecordset的結果時,文檔沒有顯示這個例子。 – tylerl

+0

對不起@tylerl,假設你已經知道如何使用'ADODB.Recordset'來添加,更新等。我在測試例子中給出的例子是使用「斷開連接的記錄集」,沒有太大的不同,但允許我加載樣本數據作爲測試。我以爲你會返回已經存儲在數據庫中的數據,準備輸出到JSON。 – Lankymart

+0

所以這是不會工作的,除非Recordset已經完全按照我想要的方式來自數據庫? – tylerl

-1

嘗試在asp頁面頂部將「content/type」設置爲「application/json」。

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> 
<% 
Option Explicit 
Response.Buffer=True 
Response.ContentType="application/json" 
Response.Charset="utf-8" 
'' rest of your code.. your db operations 
'' response write your json 
%> 
+0

這將允許瀏覽器檢測到響應爲JSON。首先,您需要將多維數組轉換爲JSON,這是問題的內容。 – Lankymart

1

這裏亞去。這對我有用。

set rs = conn.execute(strQuery) 
c=0 
Response.write "[" 
Do Until rs.eof 

    'Assign variables here with whatever you need to change 
    title = rs(0) 
    fName = rs(1) 
    lName = rs(2) 
    empID = rs(3) 

    With Response 
     if c > 0 then .write ", " 
     .write "{" & chr(34) & "Title" & chr(34) & " : " & chr(34) & title & chr(34) & ", " & chr(34) & "FirstName" & chr(34) & " : " & chr(34) & fName & chr(34) & ", " 
     .write  chr(34) & "LastName" & chr(34) & " : " & chr(34) & lName & chr(34) & ", " & chr(34) & "EmpID" & chr(34) & " : " & chr(34) & empID & chr(34) & "}" 
    End With 

    c = c + 1 
    rs.MoveNext 
Loop 
Response.write "]" 

這會將您的JSON對象直接寫入頁面。

+0

您可以使用'rs.Fields(n).Name'來填充屬性名稱而不必對它們進行硬編碼。您也不區分數字和字符串值。這基本上是'LoadRecordset()'在[JSON對象類3.5.3](https://github.com/rcdmk/aspJSON)類中做的,這就是爲什麼我不喜歡在這些情況下重新發明輪子的原因。 – Lankymart

+1

@Lankymart那麼,由於OP想要在將數據放入JSON對象之前操作數據,我向他展示了這是我親自處理這種情況的方式,因爲它使我能夠在構建對象時完全控制所有內容。老實說,我從來沒有使用LoadRecordSet(),現在好奇地嘗試它。謝謝。 – Daniel

+0

這很有道理,OP已經在使用'JSON2.asp',所以認爲建議另一個做這項工作的班級不會太過分。它非常好,並且您仍然可以對數據的結構進行一定程度的控制。 – Lankymart