我有一个ERP系统的快速开发工具,它只允许使用vbscript。我正在尝试使用VBS创建一个简单的AJAX-Request。这适用于“Microsoft.XMLHTTP”对象。
下一步是使用json从Web服务器接收数据。但是在VBS中似乎没有像“json_decode”这样的函数。
有谁知道解决方案?或者是开发自己的json函数的唯一选择吗?
答案 0 :(得分:9)
由于JSON是一种分层数据格式,正如彼得所提议的那样,使用正则表达式和Split()不会让你走得太远。
如果您的环境允许CreateObject()
,您可以使用以另一种语言编写的现成COMponent(例如,在.WSC中包装标准json2.js或启用.NET DLL的COM)。另一种选择是通过Microsoft Script Control利用另一种语言。这种方法的结论是你必须处理由另一种语言提供的对象/数组(一些提示可以在Peter所提到的主题中找到)。
可以找到纯粹的VBScript解决方案here。我无法阅读文档,但代码编译并“适用于”简单测试用例 - YMMV。
答案 1 :(得分:8)
用ASPJSON做这个怎么样?
可从http://www.aspjson.com/
我即将使用它作为一个非常古老的站点的解决方案,将带有编码数据的ajax调用(使用Jquery)发送到MongoDB进行测试。
答案 2 :(得分:3)
我有类似的问题所以我在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
答案 3 :(得分:0)
你最好根据json和asp上的查询推出自己的。比如这个Any good libraries for parsing JSON in Classic ASP? 大多数时候使用json2库,但这是基于jscript所以没有选择。 大多数情况下,这种JSON具有固定的结构,因此使用Regularexpression进行解析不应该像我在上面的一些答案中所证明的那样。 您可以发布一些JSON,以便我们可以使用一些例程来测试它。
答案 4 :(得分:0)
查看https://github.com/rcdmk/aspJSON
不确定这是否与Logan的回答中提到的www.ASPJSON.com(现已解散)有任何关系。