2012-08-28 137 views
12

我有一个ERP系统的快速开发工具,它只允许vbscript。我试图用VBS创建一个简单的AJAX请求。这与“Microsoft.XMLHTTP” - 对象一起工作。用VBScript解码/编码JSON

下一步是使用json从网络服务器接收数据。但在VBS中似乎没有像“json_decode”或其他功能。

有谁知道解决方案吗?或者是开发我自己的json函数的唯一选择?

+0

使用这个,似乎我的情况下工作: [demon.tw(http://demon.tw/my-work/vbs-json.html#code) –

回答

8

由于JSON是一种分层数据格式,正如Peter提出的那样,使用正则表达式和Split()不会让你走得太远。

如果您的环境允许CreateObject()您可能可以使用以其他语言编写的现成的组件(例如,在.WSC中包装标准json2.js或在.NET中启用.NET DLL)。另一种选择是通过Microsoft Script Control利用另一种语言。这种方法的意义在于,你必须处理由另一种语言交付的对象/数组(有些提示可以在Peter所说的主题中找到)。

可以找到一个纯VBScript解决方案here。我无法阅读文档,但代码编译并适用于简单测试用例 - YMMV。

+0

从demon.tw解决方案的伟大工程,但表现非常缓慢。我有一个10-15个简单值的简单“数组”。一个数组包含一个产品的信息。我有3500个产品,所以我必须运行JSON编码3500倍。 对于这项任务它需要2-3分钟。如果没有JSON编码,它运行得很快,但我需要这个JSON格式。有没有可能加速它? 30秒是可以接受的。 –

+0

我已经通过手动构建JSON语法解决了这个问题。我刚刚加入了字符串并用JSON-Syntax包装了它们,并且逃脱了一些特殊的字符。所以表现很棒 - 并且适用于我的情况。 –

+0

_e.g。将标准json2.js包装在.WSC或COM中启用a。NET DLL_你可以请我指向网站或任何文档如何做到这一点? – Gurman

0

你应该更好地推出自己的基于json和asp的查询。像这样一个Any good libraries for parsing JSON in Classic ASP? 大部分时间json2库被使用,但这是基于jscript所以没有选择。 也大多数时候这种JSON有一个固定的结构,所以它不应该像我在上面的几个答案中显示的Regularexpression解析那么困难。 您可以发布一些JSON,以便我们可以使用一些例程对其进行测试。

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 
+0

感谢伟大的功能斯蒂芬。请回顾以下适合您的想法的项目。 https://github.com/pravynandas/JSONToXML – PravyNandas

8

如何与ASPJSON这样做呢?
可从http://www.aspjson.com/

我就要用这个作为一个解决方案,一个很老的网站与编码数据的发送的MongoDB Ajax调用(使用jQuery),进行测试。

+1

这是最好的解决方案,它的工作原理和性能都很好。 –