Any good libraries for parsing JSON in Classic ASP?

99,854

Solution 1

Keep in mind that Classic ASP includes JScript as well as VBScript. Interestingly, you can parse JSON using JScript and use the resulting objects directly in VBScript.

Therefore, it is possible to use the canonical https://github.com/douglascrockford/JSON-js/blob/master/json2.js in server-side code with zero modifications.

Of course, if your JSON includes any arrays, these will remain JScript arrays when parsing is complete. You can access the contents of the JScript array from VBScript using dot notation.

<%@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
%>

Solution 2

Not sure about it. Have you checked ASP extreme framework which has JSON support?

Solution 3

I couldn't get the extreme-evolution or Chris Nielson's suggestion to work. But, the following did work for me:

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

Download the following as "json2.min.asp"

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

Add the following line to the top of your ASP file:

<script language="javascript" runat="server" src="json2.min.asp"></script>

You can then use JSON in ASP.

   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

Note: To parse through an array of items, you need to do the following:

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

Solution 4

I have recently implemented a VbsJson class, which has a "Decode" method to parse JSON to VBScript and a "Encode" method to generate JSON from VBScript. The code is somewhat long, so I don't paste it here.

Solution 5

I wrote this answer when I was looking for a light-weight pure VBScript only solution.

By putting together a rudimentary JSON to XML converter, we can walk the JSON string and turn it into a Microsoft.XMLDOM document.

From there, we use Microsoft's XML API including XPath queries to pluck out any values we wanted.

This handles simple JSON, but, I never intended this answer for anything more sophisticated.

For a more robust solution, the best JSON interpreter, is a proper Javascript engine. Therefore, I highly recommend the accepted answer to this question i.e. 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

The above script, transforms the following JSON:

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

into:

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

We can now use XPath to extract the tokenServicesUrl, for example:

dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
' Returns: "https://www.arcgis.com/sharing/rest/generateToken"
Share:
99,854

Related videos on Youtube

Mark Biek
Author by

Mark Biek

Updated on July 05, 2022

Comments

  • Mark Biek
    Mark Biek almost 2 years

    I've been able to find a zillion libraries for generating JSON in Classic ASP (VBScript) but I haven't been to find ANY for parsing.

    I want something that I can pass a JSON string and get back a VBScript object of some sort (Array, Scripting.Dictionary, etc)

    Can anyone recommend a library for parsing JSON in Classic ASP?

    • Shoban
      Shoban almost 15 years
      Why not create a DLL using the .net libraries available?
    • Mark Biek
      Mark Biek almost 15 years
      Due to client limitations, I can't install anything on the server. I'm hoping for something that's pure Classic ASP.
    • Mark Biek
      Mark Biek almost 15 years
      Really, I'd be happy to find something that just did arrays (including multi-dimensional). It wouldn't have to support the complete JSON spec.
    • Ricardo Souza
      Ricardo Souza almost 9 years
      I know this is old but you can check my AspJson class. It does help me a lot: github.com/rcdmk/aspJSON
  • Mark Biek
    Mark Biek almost 15 years
    You're my hero. That works perfectly! I'm going to take a look at the framework because it seems very handy but I was able to just lift out the JSON class and start using it by itself.
  • Shoban
    Shoban almost 15 years
    wow.. Glad that I was able to help you ;-)
  • Mark Biek
    Mark Biek over 14 years
    I should mention though, that this JSON class seems to have trouble with Unicode.
  • sholsinger
    sholsinger about 13 years
    The best one according to the comments of the library itself is here: github.com/nagaozen/asp-xtreme-evolution/blob/master/lib/axe‌​/… You get an upvote.
  • sholsinger
    sholsinger about 13 years
    The AXE library has this implemented here.
  • Alex KeySmith
    Alex KeySmith over 12 years
    Just a tip for those trying to include the json2.asp file in a vbscript page via <script language="JScript" runat="server" src="json2.asp"></script> make sure you remove the <script language="Javascript" runat="server"> and </script> tags from json2.asp Whilst experimenting with includes (our include code is v.complex) it got me scratching my head for a while. So hope it helps someone. :-)
  • Mark Biek
    Mark Biek over 12 years
    aspjson doesn't parse JSON, it only generates it.
  • Joe Niland
    Joe Niland over 12 years
    Good point - updated my answer to clarify
  • Rafael
    Rafael over 12 years
    in fact this is a better solution that use the whole framework
  • Mark Biek
    Mark Biek over 12 years
    That's an interesting idea. Thanks!
  • Cheeso
    Cheeso about 12 years
    You don't need a special ASP-flavored version of JSON2.js . Just use the original, and reference it using the src attribute of a <script> tag. See stackoverflow.com/a/1021848/48082 for details.
  • Flash
    Flash almost 12 years
    In case this doesn't work for anyone - I had to use <!--#include file="json2.min.asp"--> instead of <script>, and wrap <% ... %> around the json2.min.js file to create json2.min.asp, otherwise the JSON object was not accessible.
  • alphadogg
    alphadogg over 11 years
    I was trying to find a JSON library, when your post sent me away from my non-KISS approach. I realized I was going to really need to parse a message with a very well-defined format. I could slice and split it into something usable myself. Thanks.
  • Mark
    Mark over 11 years
    I converted the vbs files to asp. It works beautifully! Clean and simple. Many thanks Demon.
  • Keith
    Keith almost 9 years
    @Andrew but doesn't that require changing the entire page to JScript instead of VBScript? I tried what you suggested and I get a VBScript compilation error when encountering /*.
  • Keith
    Keith almost 9 years
    This is the only solution I could get to work using IIS / IIS Express 8.5. I suspect there have been significant changes to the ASP compilers that have rendered many of the other answers obsolete.
  • Santosh
    Santosh over 7 years
    Thanks for showing how to access the array elements. I spent a couple of hours fighting to figure it and gave up!
  • Brian White
    Brian White over 6 years
    Why convert json to XML??
  • Stephen Quan
    Stephen Quan over 6 years
    @brian-white the thinking was, once it is XML, you have the complete Microsoft XML DOM's API to do whatever.
  • Brian White
    Brian White over 5 years
    Convert it to a class :) Use some code gen over the json to make a real class and load that from json. Then you have the full power of a scripting language to do whatever you want
  • sandipchandanshive
    sandipchandanshive over 3 years
    Chris Nielsen How can I access the Object value?