将ADODB.RecordSet输出为JSON

问题描述:

我试图更改我的应用程序,以便在为某些数据发出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格式的修改结果。什么是正确的方法来做到这一点?

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

尝试在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

这里亚去。这对我有用。

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