2

私は jQuery やその他のツールを使用して ajax でアプリケーションを実行しています。一部では、従来の ASP バックエンドを使用して ajax でデータを取得したいと考えています。AX (Asp エクストリーム エディション) に JSON クラスの適切な実装が存在することがわかりました。フレームワーク、私はそれを使用しましたが、現在、私はそれをうまく使用する方法を理解していません.

編集: Scripting.Dictionary オブジェクト スレッドでJSON.Stringify が失敗するという正しい答えに基づいて、レコードセットを処理するカスタム関数を作成することにしました。

編集 2:関数 JSONStringify(object)内でJSON.stringifyを呼び出すと、値のデータが失われます。

Recordset が値としてJSONStringifyに渡されるとすべて問題ありませんが、JSON.stringifyが実行されると、レコードセットを含む必要がある " value " パラメータが未定義になります

私が期待していること(例)

SQL クエリから Recordset を渡すと、SELECT name, tel FROM users次のような出力が表示されます

[
    {"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
%>
4

2 に答える 2

2

これ:

response.write(JSON.stringify(oRs))

次のように読む必要があります。

Do Until oRS.EOF
  response.write(JSON.stringify(oRs("cve_gr") & ":" & oRs("descr"))
  oRS.MoveNext
Loop
于 2012-02-17T20:05:43.510 に答える
1

それを達成するような...

短いバージョン: json2.asp を変更し、stringify() 関数定義をハックして動作させる必要がありました。

ロングバージョン

後でコードのすべての行を確認し、問題をあきらめます。json2.asp (AXE フレームワーク) を調べて、そこで何が起こっているかを確認することにしました。

私が見ているものを見てください:

json2.asp ソース コードのスクリーンショット

行 682 から 687 まで、カスタム文字列パーサーが見つかった場合の検証がありますが、後で何もしません... Object 値のみを返します。

すべてのJavascript実装がどのように機能するかよく理解していないため、ここから推測がありますが、元のコードがうまく動作することを意味し、標準のjavascriptインタープリター(マイクロソフト以外のすべてを読む)は、この状況でオブジェクトのシリアル化を強制しますですが、JScript インタープリターはオブジェクトを解析し、値をnullとして渡そうとします。その結果、カスタム stringyfier を使用するすべての関数は、関数に渡されたオブジェクトを読み取ることができません。

OKを解決するために私がしたこと 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でいくつかの変更を行う必要がありました

<!--#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 オブジェクトで Stringify が失敗します(つまり、まだテストしていません)。

レコードセット オブジェクトを使用して変更をテストすると、この出力が得られます

"{
    {\"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\"}
}"

残された質問

私が残した質問は一種のハックです。

  • 出力の最初と最後に (") 文字が含まれていて、それ以外のすべてにエスケープ文があるのは問題ありません ?? または、発生してはならないものです。

  • この種のハックは本当に間違っています...この種の状況では、私はそれをもっとうまくやることができますか?

  • それは私の結論または議論に何か問題がありますか??

于 2012-02-22T19:38:46.493 に答える