Mar*_*iek 74 vbscript json asp-classic
我已经能够在Classic ASP(VBScript)中找到用于生成 JSON 的数量众多的库,但我还没有找到任何用于解析的 ANY .
我想要一些我可以传递JSON字符串并返回某种类型的VBScript对象(Array,Scripting.Dictionary等)的东西
Chr*_*sen 87
请记住,Classic 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
%>
Run Code Online (Sandbox Code Playgroud)
sea*_*boy 13
我无法得到极端进化或克里斯尼尔森的建议.但是,以下确实对我有用:
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>
Run Code Online (Sandbox Code Playgroud)
然后,您可以在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
Run Code Online (Sandbox Code Playgroud)
注意:要解析一系列项目,您需要执行以下操作:
for each iTmp in testing
if (TypeName(iTmp))<>"JScriptTypeInfo" then
Response.Write("Item: " & iTmp & "<br/>")
end if
next
Run Code Online (Sandbox Code Playgroud)
当我寻找一个轻量级纯 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
Run Code Online (Sandbox Code Playgroud)
上面的脚本转换以下 JSON:
{
"owningSystemUrl": "http://www.arcgis.com",
"authInfo": {
"tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
"isTokenBasedSecurity": true
}
}
Run Code Online (Sandbox Code Playgroud)
进入:
<xml owningSystemUrl="http://www.arcgis.com">
<authInfo
tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
isTokenBasedSecurity="true" >
</authInfo>
</xml>
Run Code Online (Sandbox Code Playgroud)
我们现在可以使用 XPath 来提取tokenServicesUrl,例如:
{
"owningSystemUrl": "http://www.arcgis.com",
"authInfo": {
"tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
"isTokenBasedSecurity": true
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
86757 次 |
| 最近记录: |