2017-02-22 15 views
2

Я пытаюсь изменить свое приложение так, чтобы он выводил JSON вместо HTML, когда он запрашивает некоторые данные AJAX. У меня есть ADODB RecordSet. Мне нужно прокручивать его по строкам и добавлять/изменять/удалять разные значения. Затем мне нужно взять все измененные строки и response.write их как JSON. Я использую JSON2.asp, поэтому мое приложение уже поддерживает JSON.parse & JSON.stringify, но я не могу заставить его выплевывать многомерный массив как JSON.Выход ADODB.RecordSet as 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 самостоятельно.

Если вы готовы использовать другой сценарий есть реализация по RCDMK на GitHub, что действительно есть метод 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

попробуйте настроить контент-тип на «application/json» поверх вашей страницы asp.

<%@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 object class 3.5.3] (https://github.com/rcdmk/aspJSON), поэтому я предпочитаю не изобретать колесо в этих ситуациях. – Lankymart

+1

@ Lankymart Хорошо, поскольку OP хочет манипулировать данными перед тем, как поместить его в объект JSON, я показал ему, что это то, как я лично справляюсь с этой ситуацией, поскольку он дает мне полный контроль над всем, когда я создаю объект. Честно говоря, я никогда не использовал LoadRecordSet(), и мне теперь интересно узнать, как это сделать. Благодарю. – Daniel

+0

Это имеет смысл, OP уже использовал 'JSON2.asp', поэтому мысль предложила другой класс, который делает работу не слишком большой. Это очень хорошо, и у вас все еще есть контроль над тем, как структурированы данные. – Lankymart