将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字符串。但是,我会因为几个原因而反对。
- 这是一个耗时的练习。
- 很容易错过(例如在生成输出时检查数字数据类型)。
- 根据编码方式的不同,可能会使维护(例如,如果不直接从记录集注入属性名称,而是选择“硬编码”它们),会变得很尴尬。
- 为什么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}]}
尝试在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
%>
这将允许浏览器检测到响应为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对象直接写入页面。
您可以使用'rs.Fields(n).Name'来填充属性名称而不必对它们进行硬编码。您也不区分数字和字符串值。这基本上是'LoadRecordset()'在[JSON对象类3.5.3](https://github.com/rcdmk/aspJSON)类中做的,这就是为什么我不喜欢在这些情况下重新发明轮子的原因。 – Lankymart
@Lankymart那么,由于OP想要在将数据放入JSON对象之前操作数据,我向他展示了这是我亲自处理这种情况的方式,因为它使我能够在构建对象时完全控制所有内容。老实说,我从来没有使用LoadRecordSet(),现在好奇地尝试它。谢谢。 – Daniel
这很有道理,OP已经在使用'JSON2.asp',所以认为建议另一个做这项工作的班级不会太过分。它非常好,并且您仍然可以对数据的结构进行一定程度的控制。 – Lankymart
你可以在调用'JSON.Write()'之前显示一个实际编辑记录集的例子吗?我似乎无法弄清楚如何循环浏览JSON并将字段移除/添加到每个“行”。在实际循环LoadRecordset的结果时,文档没有显示这个例子。 – tylerl
对不起@tylerl,假设你已经知道如何使用'ADODB.Recordset'来添加,更新等。我在测试例子中给出的例子是使用“断开连接的记录集”,没有太大的不同,但允许我加载样本数据作为测试。我以为你会返回已经存储在数据库中的数据,准备输出到JSON。 – Lankymart
所以这是不会工作的,除非Recordset已经完全按照我想要的方式来自数据库? – tylerl