Javascript 经典ASP:如何使用AXE json实现将记录集转换为json符号

Javascript 经典ASP:如何使用AXE json实现将记录集转换为json符号,javascript,json,asp-classic,vbscript,jscript,Javascript,Json,Asp Classic,Vbscript,Jscript,我正在使用jQuery和其他一些工具使用ajax开发一个应用程序,在某种程度上我想使用经典的ASP后端使用ajax检索数据,我看到AXE(ASP extreme edition)框架中存在一个JSON类的良好实现,我使用了它,但目前我不知道如何很好地使用它 编辑:基于线程的正确答案,我决定创建一个自定义函数来处理记录集 编辑2:现在,在函数JSONStringify(对象)内部调用JSON.stringify时,我丢失了值数据 当记录集作为值传递给JSONStringify时,一切正常,但当执行

我正在使用jQuery和其他一些工具使用ajax开发一个应用程序,在某种程度上我想使用经典的ASP后端使用ajax检索数据,我看到AXE(ASP extreme edition)框架中存在一个JSON类的良好实现,我使用了它,但目前我不知道如何很好地使用它

编辑:基于线程的正确答案,我决定创建一个自定义函数来处理记录集

编辑2:现在,在函数JSONStringify(对象)内部调用JSON.stringify时,我丢失了值数据

当记录集作为值传递给JSONStringify时,一切正常,但当执行JSON.stringify时,必须包含记录集的“value”参数将变得未定义

我期待的(示例) 通过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

%>
<!--#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>
<%
Function VBSTypeName(Obj)
    dim sType 
    sType = Cstr(TypeName(Obj))
    response.write(sType)
    VBSTypeName = sType
End Function
%>

错误
json stringify parser.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

%>
<!--#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>
<%
Function VBSTypeName(Obj)
    dim sType 
    sType = Cstr(TypeName(Obj))
    response.write(sType)
    VBSTypeName = sType
End Function
%>

函数JSONStringify(对象){
VBSTypeName(对象);
返回JSON.stringify(对象,stringifyData);
}
函数字符串化数据(持有者、键、值){
var sType='';
var结果;
//write('pre…holder='+holder+',key='+key+',value='+value');
sType=VBSTypeName(值);
//write('post='+sType);
//响应。写入(sType);
开关(sType){
“字典”的大小写:
结果='{';
for(var enr=新枚举数(值);!enr.atEnd();enr.moveNext()){
key=enr.item();
结果+='“'+key+'”:'+JSON.stringify(value.Item(key));
};
结果+='}';
返回(结果);
打破
案例“记录集”:
回答。写('here!!!');
var-sTemp='';
结果='{';
而(!value.EOF){
如果(Len(结果)>0){
结果+=',';
}
结果+='{';
对于(var i=value.Fields.Count-1;i>=0;i--){
如果(len(sTemp)>0){
sTemp+=',';
}
sTemp+=''“'+value.Fields(i.name+'”:'+JSON.stringify(value.Fields(i.value));
};
结果+='}';
}   
结果+='}';
返回结果;
打破
违约:
//响应。写入(sType);
回报(价值);
}     
//返回值,以便以常规方式对其进行处理
返回结果;
}
vbsTyper.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

%>
<!--#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>
<%
Function VBSTypeName(Obj)
    dim sType 
    sType = Cstr(TypeName(Obj))
    response.write(sType)
    VBSTypeName = sType
End Function
%>

这是:

response.write(JSON.stringify(oRs))
应该这样读:

Do Until oRS.EOF
  response.write(JSON.stringify(oRs("cve_gr") & ":" & oRs("descr"))
  oRS.MoveNext
Loop
某种程度上实现了它

简短版本:我不得不修改json2.asp,并修改stringify()函数定义,使其正常工作

长版本 后来,我看到了每一行代码,并放弃了这个问题。我决定研究一下(AXE框架)并尝试看看它在那里发生了什么

看看我看到了什么:

从第682行到第687行,如果找到了自定义stringy解析器,但之后没有做任何事情,则会进行验证。。。仅返回对象值

这里有猜测,因为我不太了解每个Javascript实现是如何工作的,但这意味着原始代码运行良好,一个标准Javascript解释器(读取除microsoft以外的所有内容)将强制在该评估中序列化对象,但是JScript解释器尝试解析对象并将值传递为null。导致每个使用自定义StringyFire的函数都无法读取在函数中传递的对象

为了解决ok,我在第688行之前插入了这段代码,强制执行自定义StringyFire,将值直接作为参数传递,避免隐式解析

        // 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中做一些更改,因为我必须修复导致此代码的一些错误

<!--#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>
剩下的问题 我留下的问题有点像黑客

  • 输出在begging和 结束了,其他一切都有逃避的感觉??或者是什么 这不应该发生

  • 这种黑客真的是错误的…我可以做得更好,在这方面 什么情况

  • 我的结论或论点有问题吗


使用您的建议会给我带来以下错误:“Microsoft JScript错误'800a139e'JSON.stringify/derechovia/includes/json2.asp,línea 685“显示无错误,但只返回1行,我想将记录集中的所有值转换为JSON数组。您必须在记录集中循环。我将添加一些。虽然您的答案在技术上是正确的,但我想创建一个更通用的函数来处理记录集,而这恰恰不是我要寻找的答案。。。不过谢谢你能举一个你正在使用的数据集的例子吗?当你说“我正在丢失值数据”时,我不确定你在说什么。@natemrice在执行函数时,“函数stringifyData(holder,key,value)”中名为value的参数为null,但必须有一个记录集对象而不是null引用。我不确定是否可以在这样的语言之间传递对象?这在过去有效吗?这可能是一个更好的解决方案:我已经用过了