我有一个 ERP 系统的快速开发工具,它只允许使用 vbscript。我正在尝试使用 VBS 创建一个简单的 AJAX 请求。这适用于“Microsoft.XMLHTTP”-对象。
下一步是使用 json 从网络服务器接收数据。但在 VBS 中似乎没有像“json_decode”这样的功能。
有谁知道解决方案?还是开发自己的 json 函数的唯一选择?
由于 JSON 是一种分层数据格式,因此正如 Peter 建议的那样,使用正则表达式和 Split() 不会让您走得太远。
如果您的环境允许,CreateObject()
您可以使用用另一种语言编写的现成 COMponent(例如,将标准 json2.js 包装在 .WSC 中或 COM 启用 .NET DLL)。另一种选择是通过 Microsoft Script Control 使用另一种语言。这种方法的缺点是您必须处理由其他语言提供的对象/数组(在彼得提到的主题中可以找到一些提示)。
可以在此处找到纯 VBScript 解决方案。我无法阅读文档,但代码可以编译并“有效”用于简单的测试用例 - YMMV。
用 ASPJSON 做这个怎么样?
可从http://www.aspjson.com/
我将使用它作为一个非常旧的站点的解决方案,将带有编码数据的 ajax 调用(使用 Jquery)发送到 MongoDB,以进行测试。
我有一个类似的问题,所以我在 VBScript 中为我的一个项目编写了一个 JSONtoXML 函数。对此脚本不作任何保证(它按原样提供并且具有已知限制,例如不处理所有类型的转义序列):
Const stateRoot = 0
Const stateNameQuoted = 1
Const stateNameFinished = 2
Const stateValue = 3
Const stateValueQuoted = 4
Const stateValueQuotedEscaped = 5
Const stateValueUnquoted = 6
Const stateValueUnquotedEscaped = 7
Function JSONToXML(json)
Dim dom, xmlElem, i, ch, state, name, value
Set dom = CreateObject("Microsoft.XMLDOM")
state = stateRoot
For i = 1 to Len(json)
ch = Mid(json, i, 1)
Select Case state
Case stateRoot
Select Case ch
Case "["
If dom.documentElement is Nothing Then
Set xmlElem = dom.CreateElement("ARRAY")
Set dom.documentElement = xmlElem
Else
Set xmlElem = XMLCreateChild(xmlElem, "ARRAY")
End If
Case "{"
If dom.documentElement is Nothing Then
Set xmlElem = dom.CreateElement("OBJECT")
Set dom.documentElement = xmlElem
Else
Set xmlElem = XMLCreateChild(xmlElem, "OBJECT")
End If
Case """"
state = stateNameQuoted
name = ""
Case "}"
Set xmlElem = xmlElem.parentNode
Case "]"
Set xmlElem = xmlElem.parentNode
End Select
Case stateNameQuoted
Select Case ch
Case """"
state = stateNameFinished
Case Else
name = name + ch
End Select
Case stateNameFinished
Select Case ch
Case ":"
value = ""
State = stateValue
End Select
Case stateValue
Select Case ch
Case """"
State = stateValueQuoted
Case "{"
Set xmlElem = XMLCreateChild(xmlElem, "OBJECT")
State = stateRoot
Case "["
Set xmlElem = XMLCreateChild(xmlElem, "ARRAY")
State = stateRoot
Case " "
Case Chr(9)
Case vbCr
Case vbLF
Case Else
value = ch
State = stateValueUnquoted
End Select
Case stateValueQuoted
Select Case ch
Case """"
xmlElem.setAttribute name, value
state = stateRoot
Case "\"
state = stateValueQuotedEscaped
Case Else
value = value + ch
End Select
Case stateValueQuotedEscaped ' @@TODO: Handle escape sequences
value = value + ch
state = stateValueQuoted
Case stateValueUnquoted
Select Case ch
Case "}"
xmlElem.setAttribute name, value
Set xmlElem = xmlElem.parentNode
state = stateRoot
Case "]"
xmlElem.setAttribute name, value
Set xmlElem = xmlElem.parentNode
state = stateRoot
Case ","
xmlElem.setAttribute name, value
state = stateRoot
Case "\"
state = stateValueUnquotedEscaped
Case Else
value = value + ch
End Select
Case stateValueUnquotedEscaped ' @@TODO: Handle escape sequences
value = value + ch
state = stateValueUnquoted
End Select
Next
Set JSONToXML = dom
End Function
Function XMLCreateChild(xmlParent, tagName)
Dim xmlChild
If xmlParent is Nothing Then
Set XMLCreateChild = Nothing
Exit Function
End If
If xmlParent.ownerDocument is Nothing Then
Set XMLCreateChild = Nothing
Exit Function
End If
Set xmlChild = xmlParent.ownerDocument.createElement(tagName)
xmlParent.appendChild xmlChild
Set XMLCreateChild = xmlChild
End Function
查看https://github.com/rcdmk/aspJSON
不确定这是否与 Logan 的回答中提到的 www.ASPJSON.com (现已不复存在)有任何关系。
您最好根据此处对 json 和 asp 的查询推出自己的。像这样一个 在经典 ASP 中解析 JSON 的任何好的库? 大多数时候使用 json2 库,但这是基于 jscript 的,所以你没有选择。大多数情况下,这种 JSON 具有固定的结构,因此使用正则表达式解析应该不那么困难,就像我在上面的几个答案中展示的那样。您可以发布一些 JSON,以便我们可以使用一些例程对其进行测试。