【问题标题】:Decode/Encode JSON with VBScript使用 VBScript 解码/编码 JSON
【发布时间】:2020-12-21 17:58:06
【问题描述】:

我有一个 ERP 系统的快速开发工具,它只允许使用 vbscript。我正在尝试使用 VBS 创建一个简单的 AJAX 请求。这适用于“Microsoft.XMLHTTP”-对象。

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

有人知道解决办法吗?还是开发自己的 json 函数的唯一选择?

【问题讨论】:

  • 用过这个,似乎对我有用:demon.tw

标签: json vbscript


【解决方案1】:

由于 JSON 是一种分层数据格式,因此按照 Peter 的建议,使用正则表达式和 Split() 不会让您走得太远。

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

可以在here 找到纯 VBScript 解决方案。我无法阅读文档,但代码可以编译并“工作”用于简单的测试用例 - YMMV。

【讨论】:

  • demon.tw 的解决方案效果很好,但性能很慢。我有一个包含 10-15 个简单值的简单“数组”。一个数组包含一个产品的信息。我有 3500 种产品,所以我必须运行 JSON 编码 3500 次。对于此任务,它的任务是 2-3 分钟。如果没有 JSON 编码,它会运行得很快,但我需要这种 JSON 格式。有没有可能加快速度? 30 秒是可以接受的。
  • 我已经通过手动构建 JSON 语法解决了这个问题。我刚刚加入了字符串本身并用 JSON 语法包装它们并转义了一些特殊字符。所以性能很棒 - 并且适用于我的情况。
  • 例如将标准 json2.js 包装在 .WSC 或 COM 中启用 .NET DLL 你能指出我的网站或任何有关如何操作的文档吗?
【解决方案2】:

用 ASPJSON 来做这件事怎么样?
来自http://www.aspjson.com/

我将使用它作为一个非常古老的站点的解决方案,将带有编码数据的 ajax 调用(使用 Jquery)发送到 MongoDB 进行测试。

【讨论】:

  • 这是最好的解决方案,它的工作格栅和性能都很好。
【解决方案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

【讨论】:

【解决方案4】:

查看https://github.com/rcdmk/aspJSON

不确定这是否与 Logan 的回答中提到的 www.ASPJSON.com(现已不复存在)有任何关系。

【讨论】:

    【解决方案5】:

    您最好根据此处对 json 和 asp 的查询推出自己的。比如这个Any good libraries for parsing JSON in Classic ASP? 大多数时候使用 json2 库,但这是基于 jscript 所以你没有选择。 大多数情况下,这种 JSON 具有固定的结构,因此使用正则表达式解析应该不那么困难,就像我在上面的几个答案中展示的那样。 您可以发布一些 JSON,以便我们使用一些例程对其进行测试。

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多