在Classic ASP中解析JSON的任何好库?

Mar*_*iek 74 vbscript json asp-classic

我已经能够在Classic ASP(VBScript)中找到用于生成 JSON 的数量众多的库,但我还没有找到任何用于解析的 ANY .

我想要一些我可以传递JSON字符串并返回某种类型的VBScript对象(Array,Scripting.Dictionary等)的东西

任何人都可以推荐一个库来解析经典ASP中的JSON吗?

Chr*_*sen 87

请记住,Classic ASP包括JScript和VBScript.有趣的是,您可以使用JScript解析JSON并直接在VBScript中使用生成的对象.

因此,可以在服务器端代码中使用规范的https://github.com/douglascrockford/JSON-js/blob/master/json2.js,无需修改.

当然,如果您的JSON包含任何数组,那么在解析完成后这些数组将保留为JScript数组.您可以使用点表示法从VBScript访问JScript数组的内容.

<%@Language="VBScript" %>
<%
Option Explicit
%>

<script language="JScript" runat="server" src='path/to/json2.js'></script>

<%

Dim myJSON
myJSON = Request.Form("myJSON") // "[ 1, 2, 3 ]"
Set myJSON = JSON.parse(myJSON) // [1,2,3]
Response.Write(myJSON)          // 1,2,3
Response.Write(myJSON.[0])      // 1
Response.Write(myJSON.[1])      // 2
Response.Write(myJSON.[2])      // 3
%>
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下不工作的人 - 我不得不使用`<! - #include文件= "json2.min.asp" - >`而不是`<script>`和`包裹<%... %>`在json2.min.js文件周围创建json2.min.asp,否则无法访问`JSON`对象. (6认同)
  • AX库实现了[这里](https://github.com/nagaozen/asp-xtreme-evolution/blob/master/lib/axe/classes/Parsers/json2.asp). (4认同)
  • 感谢您展示如何访问数组元素.我花了几个小时的时间来争取它并放弃了! (3认同)

Sho*_*ban 15

不确定.您是否检查过具有JSON支持的ASP极限框架?

  • 我应该提一下,这个JSON类似乎遇到了Unicode问题. (2认同)

sea*_*boy 13

我无法得到极端进化或克里斯尼尔森的建议.但是,以下确实对我有用:

http://tforster.wik.is/ASP_Classic_Practices_For_The_21st_Century/JSON4ASP

下载以下"json2.min.asp"

http://tforster.wik.is/@api/deki/files/2/=json2.min.asp

将以下行添加到ASP文件的顶部:

<script language="javascript" runat="server" src="json2.min.asp"></script>
Run Code Online (Sandbox Code Playgroud)

然后,您可以在ASP中使用JSON.

   Dim car: Set car = JSON.parse("{""brand"":""subaru"",""model"":""outback sport"",""year"":2003," & _
                                 """colour"":""green"",""accessories"":[" & _
                                 "{""foglamps"":true},{""abs"":true},{""heatedSeats"":true}]}")

   Response.Write("brand: " & car.brand & "<br/>")                               
   Response.Write("model: " & car.model & "<br/>")                               
   Response.Write("colour: " & car.colour & "<br/>")                               
   Response.Write("has foglamps: " & CStr(car.accessories.get(0).foglamps) & "<br/>")                               

   car.accessories.get(0).foglamps = false
   Response.Write("has foglamps: " & CStr(car.accessories.get(0).foglamps) & "<br/>")                               
   Response.Write("new Json: " & JSON.stringify(car) & "<br/>")

   Set car = Nothing
Run Code Online (Sandbox Code Playgroud)

注意:要解析一系列项目,您需要执行以下操作:

   for each iTmp in testing
       if (TypeName(iTmp))<>"JScriptTypeInfo" then 
           Response.Write("Item: " &  iTmp & "<br/>")
       end if
   next
Run Code Online (Sandbox Code Playgroud)


小智 7

我最近实现了一个VbsJson类,它有一个" Decode "方法来解析JSON到VBScript,一个" Encode "方法从VBScript生成JSON.代码有点长,所以我不在这里粘贴它.


Ste*_*uan 5

当我寻找一个轻量级纯 VBScript 解决方案时,我写了这个答案。

通过组合一个基本的 JSON 到 XML 转换器,我们可以遍历 JSON 字符串并将其转换为 Microsoft.XMLDOM 文档。

从那里,我们使用 Microsoft 的 XML API(包括 XPath 查询)来提取我们想要的任何值。

这可以处理简单的 JSON,但是,我从来没有打算用这个答案来处理更复杂的事情。

对于更强大的解决方案,最好的 JSON 解释器是合适的 Javascript 引擎。因此,我强烈推荐这个问题的公认答案,即在经典 ASP 中解析 JSON 有什么好的库吗?

Function JSONtoXML(jsonText)
  Dim idx, max, ch, mode, xmldom, xmlelem, xmlchild, name, value

  Set xmldom = CreateObject("Microsoft.XMLDOM")
  xmldom.loadXML "<xml/>"
  Set xmlelem = xmldom.documentElement

  max = Len(jsonText)
  mode = 0
  name = ""
  value = ""
  While idx < max
    idx = idx + 1
    ch = Mid(jsonText, idx, 1)
    Select Case mode
    Case 0 ' Wait for Tag Root
      Select Case ch
      Case "{"
        mode = 1
      End Select
    Case 1 ' Wait for Attribute/Tag Name
      Select Case ch
      Case """"
        name = ""
        mode = 2
      Case "{"
        Set xmlchild = xmldom.createElement("tag")
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
      Case "["
        Set xmlchild = xmldom.createElement("tag")
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
      Case "}"
        Set xmlelem = xmlelem.parentNode
      Case "]"
        Set xmlelem = xmlelem.parentNode
      End Select
    Case 2 ' Get Attribute/Tag Name
      Select Case ch
      Case """"
        mode = 3
      Case Else
        name = name + ch
      End Select
    Case 3 ' Wait for colon
      Select Case ch
      Case ":"
        mode = 4
      End Select
    Case 4 ' Wait for Attribute value or Tag contents
      Select Case ch
      Case "["
        Set xmlchild = xmldom.createElement(name)
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
        name = ""
        mode = 1
      Case "{"
        Set xmlchild = xmldom.createElement(name)
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
        name = ""
        mode = 1
      Case """"
        value = ""
        mode = 5
      Case " "
      Case Chr(9)
      Case Chr(10)
      Case Chr(13)
      Case Else
        value = ch
        mode = 7
      End Select
    Case 5
      Select Case ch
      Case """"
        xmlelem.setAttribute name, value
        mode = 1
      Case "\"
        mode = 6
      Case Else
        value = value + ch
      End Select
    Case 6
      value = value + ch
      mode = 5
    Case 7
      If Instr("}], " & Chr(9) & vbCr & vbLf, ch) = 0 Then
        value = value + ch
      Else
        xmlelem.setAttribute name, value
        mode = 1
        Select Case ch
        Case "}"
          Set xmlelem = xmlelem.parentNode
        Case "]"
          Set xmlelem = xmlelem.parentNode
        End Select
      End If
    End Select
  Wend

  Set JSONtoXML = xmlDom
End Function
Run Code Online (Sandbox Code Playgroud)

上面的脚本转换以下 JSON:

{
  "owningSystemUrl": "http://www.arcgis.com",
  "authInfo": {
    "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
    "isTokenBasedSecurity": true
  }
}
Run Code Online (Sandbox Code Playgroud)

进入:

<xml owningSystemUrl="http://www.arcgis.com">
    <authInfo
        tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
        isTokenBasedSecurity="true" >
    </authInfo>
</xml>
Run Code Online (Sandbox Code Playgroud)

我们现在可以使用 XPath 来提取tokenServicesUrl,例如:

{
  "owningSystemUrl": "http://www.arcgis.com",
  "authInfo": {
    "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
    "isTokenBasedSecurity": true
  }
}
Run Code Online (Sandbox Code Playgroud)