Классический ASP: как преобразовать RecordSet в нотацию json с помощью реализации AX json - PullRequest
2 голосов
/ 17 февраля 2012

Я делаю приложение с помощью ajax, используя jQuery и некоторые другие инструменты, и в какой-то части я хочу получать данные с помощью ajax, используя классический ASP-бэкэнд, я увидел, что существует хорошая реализация класса JSON в AX (Aspфреймворк, и я использовал его, но в настоящее время я не понимаю, как правильно его использовать.

Редактировать : на основе правильного ответа из JSON.Stringify не работает на объектах Scripting.Dictionary Поток, я решил создать пользовательскую функцию для обработки наборов записей.

Редактировать 2: Теперь я теряю данные значения, когдавызов JSON.stringify внутри функции JSONStringify (object) .

когда набор записей передается в качестве значения JSONStringify все в порядке, но когда JSON.stringify , параметр " value ", который должен содержать набор записей, становится undefined

Что я ожидаю (пример)

передача набора записей с помощьюSQL-запрос SELECT name, tel FROM users a видит вывод, подобный этому

[
    {"name":"Jonh Smith", "tel":"12345678"},
    {"name":"April Michelson", "tel":"77788802"},
    ...
]

, пропуская словарь, и видит что-то похожее, основанное на элементах, объявленных в словаре.

{
   "element1":"value1",
   "element2":"value2",
   "element3":"value3",
   "element4":"value4",
   "element5":"value5"
}

и если я хочу поддержатьдругой тип объекта я могу сделать это, расширив функцию

Исходный код

getcatalogos.asp

<!--#include file="../includes/conexion.asp" -->
<!--#include file="../includes/json2.asp" -->
<!--#include file="../includes/json-stringify-parser.asp" -->
<%
Response.ContentType = "application/json"
dim aVals(2)

function getCatalogo(tipo, params)
    Dim oConn,oCmd,sSQL,oRs,cont2
    Dim aData,oPar,cont
    dim Info 

    set oConn = Server.CreateObject("ADODB.Connection")
    set oCmd = Server.CreateObject("ADODB.Command")

    sWhere = ""

    oConn.ConnectionString = strcon
    oConn.Open
    Set oCmd.ActiveConnection = oConn

    select case tipo
        case "g"
            sSQL = " SELECT cve_gr, descr FROM gr ORDER BY descr ;"
        case "z" 
            sSQL = " SELECT cve_zn, descr FROM zn WHERE cve_gr = ? ORDER BY descr ;"
            if IsArray(params) Then
                Set oPar=oCmd.CreateParameter (params(0),129,1,2,params(1))
                oCmd.Parameters.Append(oPar)
            End if
        case else
            getCatalogo = false
            exit function
    end select

    oCmd.CommandText = sSQL
    Set oRs = oCmd.Execute()
    if Not oRs.EOF Then
        response.write(JSONStringify(oRs))
        getCatalogo = true
    else
        getCatalogo = false
    end if
    oConn.Close
end function

aVals(0) = "cve_gr"
aVals(1) = request.querystring("gr")
if Not getCatalogo(request.querystring("t"),aVals) Then
    %>error<%
end if

%>

json-stringify-parser.asp

<!--#include file="vbsTyper.asp" -->
<script runat="server" language="JScript">

    function JSONStringify(object) {
        VBSTypeName(object);
        return JSON.stringify(object,stringifyData);
    }

    function stringifyData(holder, key, value) {
        var sType = '';
        var result;

        //response.write('pre...holder=' + holder + ',key=' + key + ',value=' + value);
        sType = VBSTypeName(value);
        //response.write('post =' + sType);

        //response.write(sType);
        switch(sType){
            case 'Dictionary':
                result = '{';
                for(var enr = new Enumerator(value); !enr.atEnd(); enr.moveNext()){
                    key = enr.item();
                    result += '"' + key + '": ' + JSON.stringify(value.Item(key));
                };
                result += '}';
                return(result);
                break;
            case 'Recordset':
                response.write('here!!!');
                var sTemp = '';
                result = '{';
                while(!value.EOF){
                    if(Len(result) > 0){
                        result += ',';
                    }
                    result += '{';
                    for (var i = value.Fields.Count - 1; i >= 0; i--){
                        if(len(sTemp) > 0){
                            sTemp += ',';
                        }
                        sTemp += '"' + value.Fields(i).name + '":' + JSON.stringify( value.Fields(i).value);
                    };
                    result += '}';
                }   
                result += '}';
                return result;
                break;
            default:
                //response.write(sType);
                return(value);
        }     
        // return the value to let it be processed in the usual way
        return result;
   }

</script>

vbsTyper.asp

<%
Function VBSTypeName(Obj)
    dim sType 
    sType = Cstr(TypeName(Obj))
    response.write(sType)
    VBSTypeName = sType
End Function
%>

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Это:

response.write(JSON.stringify(oRs))

Должно читаться примерно так:

Do Until oRS.EOF
  response.write(JSON.stringify(oRs("cve_gr") & ":" & oRs("descr"))
  oRS.MoveNext
Loop
1 голос
/ 22 февраля 2012

вид достижения цели ...

Короткая версия: Мне пришлось изменить json2.asp и взломать определение функции stringify (), чтобы она работала.

Длинная версия

позже, чтобы увидеть каждую строку кода и разочароваться в проблеме.я решил взглянуть на json2.asp (AX Framework) и попытаться увидеть, что там происходит.

посмотрите, что я вижу:

screenshot of json2.asp source code

из строк 682–687 есть проверка, если найден нестандартный строковый анализатор, но позже он ничего не делает ... только возвращает значение объекта.

отсюда есть предположение, потому что яплохо понимаю, как работает каждая реализация Javascript, но подразумевает , что исходный код работает хорошо, что стандартный интерпретатор javascript ( читает все остальное, кроме microsoft здесь ) заставит сериализациюобъект в этой ситуации, но интерпретатор JScript пытается проанализировать объект и передать значение как null .в результате чего каждая функция, использующая пользовательский stringyfier, не может прочитать объект, переданный в функцию.

что я сделал, чтобы решить, хорошо, я вставил этот кусок кода перед строкой 688, заставив выполнить пользовательский stringyfier сзначение напрямую передается в качестве аргумента, избегая неявного анализа.

        // Hack & patch to deliver the stringify-ing of the object correctly
        // IDK if this is CORRECT or dont but it works in VbScript
        if(replacer){
            var textval = rep(this,'',value);
            value = textval;
        }

позже мне пришлось внести некоторые изменения в json-stringify-parser.asp , потому что мне пришлось исправить некоторые ошибки, приводящие кcode

<!--#include file="vbsTyper.asp" -->
<script runat="server" language="JScript">

    function JSONStringify(object) {
        //VBSTypeName(object);
        return JSON.stringify(object,stringifyData,4);
    }

    function stringifyData(holder, key, value) {
        var sType = '';
        var result;

        //response.write('pre...holder=' + holder + ',key=' + key + ',value=' + value);
        sType = VBSTypeName(value);
        //response.write('post =' + sType);

        //response.write(sType);
        switch(sType){
            case 'Dictionary':
                result = '{';
                for(var enr = new Enumerator(value); !enr.atEnd(); enr.moveNext()){
                    key = enr.item();
                    result += '"' + key + '": ' + JSON.stringify(value.Item(key));
                };
                result += '}';
                return(result);
                break;
            case 'Recordset':
                //response.write('here!!!');
                var sTemp;
                result = '';
                while(!value.EOF){
                    if(result.length > 0){
                        result += ',';
                    }
                    result += '{';
                    sTemp=''
                    for (var i = 0; i < value.fields.Count; i++){
                        if(sTemp.length > 0){
                            sTemp += ',';
                        }
                        //response.write("i=" + i + ",");
                        sTemp += '"' + value.fields.item(i).name + '":' + JSON.stringify( value.fields.item(i).value);
                    };
                    result += sTemp + '}';
                    value.moveNext();
                }   
                result = '{' + result  + '}';
                return result;
                break;
            default:
                //response.write(sType);
                return(value);
        }     
        // return the value to let it be processed in the usual way
        return result;
   }

</script>

часть для разбора Recordset работает, часть для разбора словаря такая же, как показано в JSON.Stringify не работает на объектах Scripting.Dictionary (aka i haven 'пока не проверял) но пока я с этим покончил.

проверка моих изменений с помощью объекта набора записей приводит к таким выводам

"{
    {\"clave\":\"BC\",\"descripcion\":\"Cal\"},
    {\"clave\":\"CT\",\"descripcion\":\"Center\"},
    {\"clave\":\"NE\",\"descripcion\":\"Norw\"},
    {\"clave\":\"NO\",\"descripcion\":\"Nore\"},
    {\"clave\":\"NT\",\"descripcion\":\"North\"},
    {\"clave\":\"OC\",\"descripcion\":\"East\"},
    {\"clave\":\"OR\",\"descripcion\":\"West\"},
    {\"clave\":\"PE\",\"descripcion\":\"Pen\"},
    {\"clave\":\"SE\",\"descripcion\":\"Southe\"},
    {\"clave\":\"ZM\",\"descripcion\":\"Met\"}
}"

Оставленные вопросы

вопрос, который я оставил с таким взломом.

  • Это нормально, что вывод имеет символ (") в начале и в конце, и все остальное имеет escape-выражения ?? или это то, что не должно происходить.

  • этот вид взлома действительно неправильный ... я могу сделать это лучше, в такой ситуации?

  • что-то не так в моем заключении или аргументах ??

...