如何在经典ASP中返回JSON对象

17

我想使用经典ASP脚本返回一个JSON对象(它是AJAX请求的一部分)。

如果我只是像这样发送文本响应:

response.write("{ query:'Li', suggestions:['Liberia','Libyan Arab Jamahiriya','Liechtenstein','Lithuania'], data:['LR','LY','LI','LT'] }")

这个能行吗,还是我真的需要一个JSON库?

编辑:我正在尝试让http://www.devbridge.com/projects/autocomplete/jquery/#howto上的自动完成插件工作。

javascript:

 $(document).ready(function() {
    var a = $('#txtValue').autocomplete({ 
    serviceUrl:'script.asp',
    minChars:2, 
    maxHeight:400,
    width:300,
    zIndex: 9999,
    deferRequestBy: 0, //miliseconds
    onSelect: function(value, data){ alert('You selected: ' + value + ', ' + data); },
});

ASP:

<% 
response.ContentType = "application/json"
response.write("{ query:'Li', suggestions:['Liberia','Libyan Arab Jamahiriya','Liechtenstein','Lithuania'], data:['LR','LY','LI','LT'] }") 
%>

自动完成功能无法工作。如果使用本地查找数组,例如 lookup: ['January', 'February', 'March', 'April', 'May'],则可以正常工作。

但是由于ajax存在问题,它无法正确返回列表。


你真的试过吗?试一试吧,你有什么可失去的呢? - Jon P
我试过了,不起作用哈哈。我只是不确定这是否是原因。我正在尝试让自动完成插件(http://www.devbridge.com/projects/autocomplete/jquery/#howto)工作。 - Flash
我知道你已经解决了你的问题,但是这里有一个链接可以验证你的JSON并确保它不是导致问题的原因: http://jsonlint.com/ - Onaiggac
3个回答

34

看起来是客户端解析错误。

我原本认为这不会有任何影响,但事实证明,如果您将所有内容都加引号,包括属性名称,在此过程中使用双引号而非单引号,则似乎能够起作用。

记得要将双引号加倍(至少我认为在VBScript中是这样做的 - 已经很久没有使用了)。

所以:

<%
    Response.ContentType = "application/json"
    Response.Write("{ ""query"":""Li"", ""suggestions"":[""Liberia"",""Libyan Arab Jamahiriya"",""Liechtenstein"",""Lithuania""], ""data"":[""LR"",""LY"",""LI"",""LT""] }")
%>

我不明白为什么这样做不行。只要确保将内容类型设置为“application/json”即可。 - Joe Enos
在插件的文档中,它说:“为 Ajax 自动完成提供数据的网页将收到带有查询字符串 ?query=Li 的 GET 请求,并且必须以以下格式返回 JSON 数据”,然后给出了我的问题中的字符串。如果我只是像所示那样 response.write 它,它不应该可以用于测试吗? - Flash
我添加了 response.ContentType = "application/json",但它仍然不起作用 :( - Flash
抢我说了。是的,在vbScript中加倍引号来转义它们。 - Jon P
3
这不是解析错误。JSON语法指定属性名称为字符串,而且字符串必须用双引号括起来。 - Cheran Shunmugavel
在设置内容类型之前,请使用Response.Clear以使其在IE 8或以下版本中正常工作。 - Yogesh Jindal

3
我用下面的代码使之工作了... 在加倍引号和放入查询字符串后。
currQuery= request.querystring("query")
response.expires=-1
Dim rsMain,sqlMain,rettxt,JobOpenToArr
set rsMain= Server.CreateObject("ADODB.Recordset")
rsMain.CursorLocation = adUseClient
sqlMain = "select JobOpenTo FROM Jobs WHERE JobOpenTo LIKE '%"&currQuery & "%' group by JobOpenTo order by JobOpenTo" 
rsMain.Open sqlMain, Session("XXX_CMS")
if Not rsMain.Eof  Then   
              '## build the string
       rettxt = "{query:""" & currQuery & """, suggestions:["

     JobOpenToArr = rsMain.getRows()     
     For i = 0 to UBound(JobOpenToArr,2)

       rettxt = rettxt & """" & JobOpenToArr(0,i) & ""","

     Next    
     '##knock off trailing comma
     rettxt = left(rettxt,len(rettxt)-1)
     rettxt = rettxt & "]}"
     Response.Write rettxt 

3

Joe的答案对您应该是可行的。但是,如果您将从经典ASP输出大量JSON,则可能需要查看aspjson


使用Crockford的json2.js脚本也很简单。https://github.com/douglascrockford/JSON-js/blob/master/json2.js 参见https://dev59.com/tEzSa4cB1Zd3GeqPjRJM#9630663 - Cheeso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接