我已经能够在经典 ASP (VBScript) 中找到无数用于生成 JSON 的库,但我还没有找到任何用于解析的库。
我想要一些可以传递 JSON 字符串并返回某种类型的 VBScript 对象(Array、Scripting.Dictionary 等)的东西
请记住,经典 ASP 包括 JScript 和 VBScript。有趣的是,您可以使用 JScript 解析 JSON 并直接在 VBScript 中使用生成的对象。
因此,可以在服务器端代码中使用规范的 https://github.com/douglascrockford/JSON-js/blob/master/json2.js 进行零修改。
当然,如果您的 JSON 包含任何数组,则解析完成后这些将仍然是 JScript 数组。您可以使用点表示法从 VBScript 访问 JScript 数组的内容。
<%@Language="VBScript" %>
<%
Option Explicit
%>
<script language="JScript" runat="server" src='path/to/json2.js'></script>
<%
Dim myJSON
myJSON = Request.Form("myJSON") // "[ 1, 2, 3 ]"
Set myJSON = JSON.parse(myJSON) // [1,2,3]
Response.Write(myJSON) // 1,2,3
Response.Write(myJSON.[0]) // 1
Response.Write(myJSON.[1]) // 2
Response.Write(myJSON.[2]) // 3
%>
不确定。你检查过ASP Extreme框架有JSON支持吗?
我无法让极端进化或克里斯·尼尔森的建议发挥作用。 但是,以下方法对我有用:
http://tforster.wik.is/ASP_Classic_Practices_For_The_21st_Century/JSON4ASP
下载以下内容为“json2.min.asp”
http://tforster.wik.is/@api/deki/files/2/=json2.min.asp
将以下行添加到 ASP 文件的顶部:
<script language="javascript" runat="server" src="json2.min.asp"></script>
然后您可以在 ASP 中使用 JSON。
Dim car: Set car = JSON.parse("{""brand"":""subaru"",""model"":""outback sport"",""year"":2003," & _
"""colour"":""green"",""accessories"":[" & _
"{""foglamps"":true},{""abs"":true},{""heatedSeats"":true}]}")
Response.Write("brand: " & car.brand & "<br/>")
Response.Write("model: " & car.model & "<br/>")
Response.Write("colour: " & car.colour & "<br/>")
Response.Write("has foglamps: " & CStr(car.accessories.get(0).foglamps) & "<br/>")
car.accessories.get(0).foglamps = false
Response.Write("has foglamps: " & CStr(car.accessories.get(0).foglamps) & "<br/>")
Response.Write("new Json: " & JSON.stringify(car) & "<br/>")
Set car = Nothing
注意:要解析项目数组,您需要执行以下操作:
for each iTmp in testing
if (TypeName(iTmp))<>"JScriptTypeInfo" then
Response.Write("Item: " & iTmp & "<br/>")
end if
next
我最近实现了一个VbsJson类,它有一个“Decode”方法将JSON解析为VBScript和一个“Encode”方法从VBScript生成JSON。代码有点长,就不贴在这里了
我在寻找轻量级纯 VBScript 解决方案时写了这个答案。
通过组合一个基本的 JSON 到 XML 转换器,我们可以遍历 JSON 字符串并将其转换为 Microsoft.XMLDOM 文档。
从那里,我们使用 Microsoft 的 XML API(包括 XPath 查询)来提取我们想要的任何值。
这可以处理简单的 JSON,但是,我从来没有打算用这个答案来处理更复杂的事情。
对于更强大的解决方案,最好的 JSON 解释器是合适的 Javascript 引擎。因此,我强烈推荐这个问题的公认答案,即 在经典 ASP 中解析 JSON 有什么好的库吗?
Function JSONtoXML(jsonText)
Dim idx, max, ch, mode, xmldom, xmlelem, xmlchild, name, value
Set xmldom = CreateObject("Microsoft.XMLDOM")
xmldom.loadXML "<xml/>"
Set xmlelem = xmldom.documentElement
max = Len(jsonText)
mode = 0
name = ""
value = ""
While idx < max
idx = idx + 1
ch = Mid(jsonText, idx, 1)
Select Case mode
Case 0 ' Wait for Tag Root
Select Case ch
Case "{"
mode = 1
End Select
Case 1 ' Wait for Attribute/Tag Name
Select Case ch
Case """"
name = ""
mode = 2
Case "{"
Set xmlchild = xmldom.createElement("tag")
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
Case "["
Set xmlchild = xmldom.createElement("tag")
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
Case "}"
Set xmlelem = xmlelem.parentNode
Case "]"
Set xmlelem = xmlelem.parentNode
End Select
Case 2 ' Get Attribute/Tag Name
Select Case ch
Case """"
mode = 3
Case Else
name = name + ch
End Select
Case 3 ' Wait for colon
Select Case ch
Case ":"
mode = 4
End Select
Case 4 ' Wait for Attribute value or Tag contents
Select Case ch
Case "["
Set xmlchild = xmldom.createElement(name)
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
name = ""
mode = 1
Case "{"
Set xmlchild = xmldom.createElement(name)
xmlelem.appendChild xmlchild
xmlelem.appendchild xmldom.createTextNode(vbCrLf)
xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
Set xmlelem = xmlchild
name = ""
mode = 1
Case """"
value = ""
mode = 5
Case " "
Case Chr(9)
Case Chr(10)
Case Chr(13)
Case Else
value = ch
mode = 7
End Select
Case 5
Select Case ch
Case """"
xmlelem.setAttribute name, value
mode = 1
Case "\"
mode = 6
Case Else
value = value + ch
End Select
Case 6
value = value + ch
mode = 5
Case 7
If Instr("}], " & Chr(9) & vbCr & vbLf, ch) = 0 Then
value = value + ch
Else
xmlelem.setAttribute name, value
mode = 1
Select Case ch
Case "}"
Set xmlelem = xmlelem.parentNode
Case "]"
Set xmlelem = xmlelem.parentNode
End Select
End If
End Select
Wend
Set JSONtoXML = xmlDom
End Function
上面的脚本,转换以下 JSON:
{
"owningSystemUrl": "http://www.arcgis.com",
"authInfo": {
"tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
"isTokenBasedSecurity": true
}
}
进入:
<xml owningSystemUrl="http://www.arcgis.com">
<authInfo
tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
isTokenBasedSecurity="true" >
</authInfo>
</xml>
我们现在可以使用 XPath 来提取
tokenServicesUrl
,例如:
dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
' Returns: "https://www.arcgis.com/sharing/rest/generateToken"
AXE 是一个很棒的库,但如果您只需要 JSON 处理功能,它就相当沉重。
但是,我确实从 AX 项目中获取了 base.asp 文件和 json.asp 类文件,并成功使用它们在我的项目中实现了 JSON 解析。
对于 JSON 生成,我发现 aspjson 更易于集成。它还具有更强大的json相关功能。 axe 文档有点缺乏,集成到项目中需要做更多工作,但是它在将 JSON VB 对象序列化回字符串方面做得很好。
这里的解决方案非常好,但有时有些矫枉过正。 如果 JSON 很简单并且结构始终相同,您可以自己解析它,那么它既快速又简单。
'read data from client
records = Request.Form("records")
'convert the JSON string to an array
Set oRegExpre = new RegExp
oRegExpre.Global = true
oRegExpre.Pattern = "[\[\]\{\}""]+"
records = replace(records, "},{","||")
records = oRegExpre.Replace(records, "" )
aRecords = split(records,"||")
'iterate the array and do some cleanup
for each rec in aRecords
aRecord = split(rec,",")
id = split(aRecord(1),":")(1)
field = split(aRecord(0),":")(0)
updateValue = split(aRecord(0),":")(1)
updateValue = replace(updateValue,chr(10),"\n")
updateValue = replace(updateValue,chr(13),"\r")
updateValue = replace(updateValue,"'","''")
'etc
next