代码之家  ›  专栏  ›  技术社区  ›  Mark Biek

在经典的ASP中有解析JSON的好库吗?[关闭]

  •  72
  • Mark Biek  · 技术社区  · 17 年前

    我找到了无数的图书馆 生成 经典ASP(vbscript)中的JSON,但我还没有找到 句法分析 .

    我想要一些可以传递JSON字符串并返回某种类型的vbscript对象(数组、脚本、字典等)的东西。

    有人能推荐一个在经典ASP中解析JSON的库吗?

    8 回复  |  直到 17 年前
        1
  •  84
  •   Cheeso    14 年前

    请记住,经典的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
    %>
    
        2
  •  15
  •   Shoban    17 年前

    不确定。你查过了吗 ASP extreme 支持JSON的框架?

        3
  •  13
  •   seanyboy    16 年前

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

    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>
    

    然后可以在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
    

    注意:要通过项目数组进行分析,需要执行以下操作:

       for each iTmp in testing
           if (TypeName(iTmp))<>"JScriptTypeInfo" then 
               Response.Write("Item: " &  iTmp & "<br/>")
           end if
       next
    
        4
  •  7
  •   Demon    14 年前

    我最近实施了 VbsJson 类,其中有一个“ 译码 “将JSON解析为vbscript和a的方法” 编码 “从vbscript生成json的方法。代码有点长,所以我不把它粘贴在这里。

        6
  •  3
  •   Stephen Quan    8 年前

    我在寻找轻量纯vbscript解决方案时写下了这个答案。

    通过将基本的JSON-to-XML转换器组合在一起,我们可以遍历JSON字符串并将其转换为microsoft.xmldom文档。

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

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

    对于更健壮的解决方案,最好的JSON解释器是一个适当的JavaScript引擎。因此,我强烈推荐这个问题的公认答案,即 Any good libraries for parsing JSON in Classic ASP?

    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
    

    上面的脚本转换以下JSON:

    {
      "owningSystemUrl": "http://www.arcgis.com",
      "authInfo": {
        "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
        "isTokenBasedSecurity": true
      }
    }
    

    进入:

    <xml owningSystemUrl="http://www.arcgis.com">
        <authInfo
            tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
            isTokenBasedSecurity="true" >
        </authInfo>
    </xml>
    

    我们现在可以使用xpath提取 tokenServicesUrl 例如:

    dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
    ' Returns: "https://www.arcgis.com/sharing/rest/generateToken"
    
        7
  •  2
  •   Joe Niland    14 年前

    AXE是一个很好的库,但如果您只需要JSON处理功能,它就相当重。

    但是,我确实从axe项目中获取了base.asp文件和json.asp类文件,并成功地使用它们在我的项目中实现了json解析。

    对于JSON的生成,我发现 aspjson 集成起来更简单。它还具有更强大的JSON相关特性。AXE文档有点欠缺,需要更多的工作来集成到项目中,但是它确实做了一个很好的工作,将其JSONVB对象序列化为一个字符串。

        8
  •  2
  •   peter    14 年前

    这里的解决方案非常好,但有时会造成过度破坏。 如果JSON很简单并且总是相同的结构,那么您可以自己解析它,它既快速又简单。

     'read data from client
     records = Request.Form("records")
     'convert the JSON string to an array
     Set oRegExpre = new RegExp
     oRegExpre.Global = true
     oRegExpre.Pattern = "[\[\]\{\}""]+"
     records = replace(records, "},{","||")
     records = oRegExpre.Replace(records, "" )
     aRecords = split(records,"||")
     'iterate the array and do some cleanup
     for each rec in aRecords
       aRecord = split(rec,",")
       id          = split(aRecord(1),":")(1)
       field       = split(aRecord(0),":")(0)
       updateValue = split(aRecord(0),":")(1)
       updateValue = replace(updateValue,chr(10),"\n")
       updateValue = replace(updateValue,chr(13),"\r")
       updateValue = replace(updateValue,"'","''")
      'etc
    next