从发布的JSON中获取经典ASP变量

我试图通过AJAX将JSON发布到经典ASP页面,该页面检索值,检查数据库并将JSON返回到原始页面。

我可以通过AJAX发布JSON。 我可以从ASP返回JSON。 我无法将发布的JSON检索到ASP变量中。

POST你使用Request.Form,GET你使用Request.Querystring。 我对JSON使用什么?

我有JSON库,但它们只显示在ASP脚本中创建一个字符串然后解析它。 我需要在传递外部变量时解析JSON。

使用Javascript

var thing = $(this).val(); $.ajax({ type: "POST", url: '/ajax/check_username.asp', data: "{'userName':'" + thing + "'}", contentType: "application/json; charset=utf-8", dataType: "json", cache: false, async: false, success: function() { alert('success'); } }); 

ASP文件(check_username.asp)

  Response.ContentType = "application/json" sEmail = request.form() -- THE PROBLEM Set oRS = Server.CreateObject("ADODB.Recordset") SQL = "SELECT SYSUserID FROM dbo.t_SYS_User WHERE Username='"&sEmail&"'" oRS.Open SQL, oConn if not oRS.EOF then sStatus = (new JSON).toJSON("username", true, false) else sStatus = (new JSON).toJSON("username", false, false) end if response.write sStatus 

alphadogg的解决方案对我不起作用,我在行bStream.Write requestBody出错(说“在此上下文中不允许操作。”)这似乎对我bStream.Write requestBody ,并返回整个请求字符串。 但是,它只适用于请求数据<= 100 KB,否则您将不得不弄清楚如何使BinaryRead方法正常工作。

 str = Request.Form 

(发自http://msdn.microsoft.com/en-us/library/ms525985%28v=VS.90%29.aspx )

alphadogg的代码对我有用,但只有在我指定了更多信息之后:

 bytecount = Request.TotalBytes bytes = Request.BinaryRead(bytecount) Set stream = Server.CreateObject("ADODB.Stream"); stream.Type = 1; // adTypeBinary stream.Open(); stream.Write(bytes); stream.Position = 0; stream.Type = 2; // adTypeText stream.Charset = "utf-8"; Set s = stream.ReadText(); stream.Close(); 

在此之前,我会得到“在这种情况下不允许操作”。 正如jjokin报道的那样。

您可以考虑从VBScript切换到JScript(JScript就是微软称之为JavaScript的东西)。

为什么? 因为从Classic ASP中可以执行与浏览器相同的JSON调用,并使用eval()语句将结果读入JavaScript对象。

Paddy Said:我没有答案,但你有我的每一个同情……经典的asp和JSON处理 – 听起来很有趣。

@Paddy:经典ASP和JSON很有趣,实际上它就是ROCKS! (如果从VBScript切换并使用JScript。)

请注意,您不必退出VBScript冷 – 火鸡,您仍然可以在同一个ASP文件中的两者之间进行互操作,但如果您首先声明JScript,则需要将VBScript限制为SUB或函数,反之亦然,否则无法预测的事情可以发生。

这是我正在谈论的一个简单例子:

 <%@ LANGUAGE="JScript" %> <% var days = VBDateDiff("d", "4/10/2010", "5/3/2010"); Response.write("JScript Calling VBScript function: days = " + days); %>  <% %> 

我有同样的问题但很快我想出如何将json对象发布到ASP服务器。

这是一个想法:未经测试。 努力工作> <。

将json对象解析为字符串然后回发到服务器。(这是一个典型的字符串发布)

在ASP端,使用JSON库将字符串解析回对象。

JSON库的链接http://code.google.com/p/aspjson/

‘我认为尝试将JSON发回给asp的人应该具备基本的发布知识。 任何进一步的帮助,请告诉我

不知道你是否还在寻找,但这个答案可能对你有帮助。 但是,该代码适用于ASP.NET页面。 经典的ASP模拟是:

  byteCount = Request.TotalBytes requestBody = Request.BinaryRead(byteCount) 

然后,您可能希望将其转换为要解析/使用的字符串。 您可以使用ADODB.Stream进行转换。

  Set bStream= CreateObject("ADODB.Stream") bStream.Open bStream.Write requestBody bStream.Position = 0 bStream.Type = adTypeText str = bStream.ReadText 

这是我在ASP Vbscript中使用Radium的代码和一些更正的解决方案:

 bytecount = Request.TotalBytes bytes = Request.BinaryRead(bytecount) Set stream = Server.CreateObject("ADODB.Stream") stream.Type = 1 'adTypeBinary stream.Open() stream.Write(bytes) stream.Position = 0 stream.Type = 2 'adTypeText stream.Charset = "utf-8" s = stream.ReadText() 'here is your json as a string stream.Close() Set stream = nothing Response.write(s) 

通常(新的VBArray(arr).toArray())应该在SafeArray上工作,这是Request.BinaryRead返回的。 但事实并非如此。 我找到了这个我修改过的解决方案:

 function GetRawRequestData() { var byteCount = Request.TotalBytes; var binary = Request.BinaryRead(byteCount) var reader = Server.CreateObject('ADODB.Recordset'); reader.Fields.Append('x', 201, byteCount); reader.Open(); reader.AddNew(); reader.Fields(0).AppendChunk(binary); reader.update(); return reader.Fields(0).Value; } 

感谢Rasberry的评论@ http://blogs.msdn.com/b/david.wang/archive/2006/07/04/howto-convert-between-jscript-array-and-vb-safe-array.aspx

请注意,它可能无法正确处理编码。 我没有深入研究201 ADO数据类型的含义,但它确实有效。

您可以通过此代码找到所有发布的参数。

 FUNCTION getQueryString() dim queryLink, queryItemName queryLink = "" On error Resume Next For each queryItemName in Request.QueryString Execute(queryItemName & " = stripQuery(Request.QueryString(""" & queryItemName & """))") queryLink = queryLink & "&" & queryItemName & "=" & Request.QueryString(queryItemName) Next For each queryItemName in Request.Form Execute(queryItemName & " = stripQuery(Request.Form(""" & queryItemName & """))") queryLink = queryLink & "&" & queryItemName & "=" & Request.Form(queryItemName) Next On Error Goto 0 getQueryString = queryLink END FUNCTION response.write getQueryString()