使用VBScript解码/编码JSON

19

我有一个用于ERP系统的快速开发工具,只支持vbscript语言。我正在尝试使用VBS创建一个简单的AJAX请求。使用“Microsoft.XMLHTTP”对象可以实现这一点。

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

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


使用这个,对我的情况似乎有效:demon.tw - Stefan Brendle
5个回答

14

由于JSON是一种分层数据格式,因此采用Peter提出的正则表达式和Split()方法并不能帮助你解决问题。

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

可以在这里找到纯VBScript解决方案。我无法阅读文档,但代码能够编译并对简单测试用例有效 - YMMV。


demon.tw的解决方案非常好,但性能非常慢。我有一个包含10-15个简单值的简单“数组”。一个单一的数组包含一个产品的信息。我有3500个产品,所以我需要运行3500次JSON编码。对于这个任务,它需要2-3分钟。没有JSON编码运行得很快,但我需要这种JSON格式。有没有可能加快速度? 30秒是可以接受的。 - Stefan Brendle
我通过手动构建JSON语法来解决了这个问题。我只是将字符串连接起来,并用JSON语法包装它们并转义了一些特殊字符。因此性能非常好 - 在我的情况下可以正常工作。 - Stefan Brendle
你能否指向一个网站或者任何关于如何将标准的json2.js包装在.WSC或COM中,或者是启用.NET DLL的文档呢? - Gurmanjot Singh
谢谢Ekkehard,这个解决方案对我很有用。我在想你应该把代码粘贴在这里,因为将来该域名可能会消失,解决方案也会丢失?我的JSON代码与他们的示例不同,但我没有改变他们的代码,而是修改了我的JSON响应以匹配语法。我的JSON以[]括号开头,所以我只是在外面加了一些额外的标记,像这样:{"results":[ ... ]}。我只是想说感谢您的分享。 - Rosski

11

如何使用ASPJSON完成此操作?
可从http://www.aspjson.com/获取。

我将把这个作为解决方案应用于一个非常老的网站,通过发送编码数据的ajax调用(使用Jquery)到MongoDB进行测试。


1
这是最佳解决方案,它的工作效果很棒,性能也很好。 - Roy Shoa

4

我曾经遇到过类似的问题,所以我为我的一个项目编写了一个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

感谢Stephen出色的函数。请查看下面项目,该项目是基于你的想法进行改编的。https://github.com/pravynandas/JSONToXML - PravyNandas

1

0
你最好基于一个关于json和asp的查询来自己编写。例如这个链接 Any good libraries for parsing JSON in Classic ASP?。大多数情况下会使用json2库,但它是基于jscript的,所以对你来说没有选择。此外,大多数情况下,这种JSON具有固定的结构,因此使用正则表达式解析不应该太困难,就像我在上面的一些答案中演示的那样。你可以发布一些JSON数据,以便我们可以用一些程序进行测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接