有什么好的库可以解析经典 ASP 中的 JSON 吗?

我已经能够在经典 ASP (VBScript)中为 产生 JSON 找到无数的库,但是我还没有为 解析找到任何库。

我想要的东西,我可以传递一个 JSON 字符串,并得到一个 VBScript 对象的排序(数组,脚本。字典等)

有人能推荐一个在经典 ASP 中解析 JSON 的库吗?

101568 次浏览

不确定。您检查过支持 JSON 的 ASP 极端框架吗?

请记住,经典 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
%>

我无法让极端进化论或者克里斯 · 尼尔森的建议起作用。 但是,以下几点确实对我有用:

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

AXE 是一个很棒的库,但是如果您只需要 JSON 处理功能,那么它就相当重了。

但是,我确实从 AXE 项目中获取了 base.asp 文件和 JSON.asp 类文件,并成功地使用它们在我的项目中实现了 JSON 解析。

对于 JSON 生成,我发现 Aspjson更容易集成。它还具有更强大的 json 相关特性。斧头文档有点缺乏,需要更多的工作来集成到项目中,但是它确实能够很好地将其 JSON VB 对象序列化回字符串。

我写这个答案时,我正在寻找一个轻量级纯 VBScript 解决方案。

通过组合一个基本的 JSON 到 XML 转换器,我们可以遍历 JSON 字符串并将其转换为 Microsoft.XMLDOM 文档。

从那里,我们使用微软的 XMLAPI (包括 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"

我最近实现了一个 < strong > VbsJson 类,它有一个“ 解码”方法来解析 JSON 到 VBScript,还有一个“ 编码”方法来从 VBScript 生成 JSON。代码有点长,所以我不在这里粘贴它。

这里的解决方案非常好,但有时过头了。 如果 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