¿Alguna buena biblioteca para analizar JSON en ASP clásico? [cerrado]

77

He podido encontrar un trillón de bibliotecas para generar JSON en ASP clásico (VBScript) pero no he encontrado NINGUNA para analizar .

Quiero algo que pueda pasar una cadena JSON y recuperar un objeto VBScript de algún tipo (Array, Scripting.Dictionary, etc.)

¿Alguien puede recomendar una biblioteca para analizar JSON en ASP clásico?

Mark Biek
fuente
1
¿Por qué no crear una DLL utilizando las bibliotecas .net disponibles?
Shoban
1
Debido a las limitaciones del cliente, no puedo instalar nada en el servidor. Espero algo que sea puro ASP clásico.
Mark Biek
1
Realmente, estaría feliz de encontrar algo que solo hiciera arreglos (incluso multidimensionales). No tendría que admitir la especificación JSON completa.
Mark Biek
3
Sé que esto es antiguo, pero puedes consultar mi clase AspJson. Me ayuda mucho: github.com/rcdmk/aspJSON
Ricardo Souza

Respuestas:

92

Tenga en cuenta que Classic ASP incluye tanto JScript como VBScript. Curiosamente, puede analizar JSON usando JScript y usar los objetos resultantes directamente en VBScript.

Por lo tanto, es posible utilizar el https://github.com/douglascrockford/JSON-js/blob/master/json2.js canónico en el código del lado del servidor sin modificaciones.

Por supuesto, si su JSON incluye matrices, estas seguirán siendo matrices JScript cuando se complete el análisis. Puede acceder al contenido de la matriz JScript desde VBScript utilizando notación de puntos.

<%@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
%>
Chris Nielsen
fuente
5
La biblioteca AX tiene esto implementado aquí .
sholsinger
de hecho, esta es una mejor solución que usa todo el marco
Rafael
6
En caso de que esto no funcione para nadie, tuve que usar en <!--#include file="json2.min.asp"-->lugar de <script>y ajustar <% ... %>el archivo json2.min.js para crear json2.min.asp, de lo contrario, el JSONobjeto no era accesible.
Flash
1
@Andrew, pero ¿eso no requiere cambiar toda la página a JScript en lugar de VBScript? Probé lo que sugirió y obtengo un error de compilación de VBScript al encontrarlo /*.
Keith
3
Gracias por mostrar cómo acceder a los elementos de la matriz. ¡Pasé un par de horas luchando para resolverlo y me rendí!
Santosh
16

No estoy seguro de eso. ¿Ha comprobado el marco extremo ASP que tiene soporte JSON?

Shoban
fuente
Eres mi heroe. ¡Eso funciona perfectamente! Voy a echar un vistazo al marco porque parece muy útil, pero pude simplemente sacar la clase JSON y comenzar a usarlo por sí solo.
Mark Biek
wow .. Me alegro de haber podido ayudarte ;-)
Shoban
2
Sin embargo, debo mencionar que esta clase JSON parece tener problemas con Unicode.
Mark Biek
Solo un consejo para aquellos que intentan incluir el archivo json2.asp en una página vbscript a través de <script language = "JScript" runat = "server" src = "json2.asp"> </script> asegúrese de eliminar el <script language = "Javascript" runat = "server"> y </script> etiquetas de json2.asp Mientras experimentaba con las inclusiones (nuestro código de inclusión es v.complex) me hizo rascarme la cabeza por un tiempo. Así que espero que ayude a alguien. :-)
Alex KeySmith
14

No pude conseguir que la evolución extrema o la sugerencia de Chris Nielson funcionaran. Pero, lo siguiente funcionó para mí:

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

Descargue lo siguiente como "json2.min.asp"

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

Agregue la siguiente línea en la parte superior de su archivo ASP:

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

Luego puede usar JSON en 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

Nota: Para analizar una variedad de elementos, debe hacer lo siguiente:

   for each iTmp in testing
       if (TypeName(iTmp))<>"JScriptTypeInfo" then 
           Response.Write("Item: " &  iTmp & "<br/>")
       end if
   next
seanyboy
fuente
1
No necesita una versión especial con sabor a ASP de JSON2.js. Simplemente use el original y haga referencia a él usando el srcatributo de una <script>etiqueta. Consulte stackoverflow.com/a/1021848/48082 para obtener más detalles.
Cheeso
8

Recientemente implementé una clase VbsJson , que tiene un método " Decode " para analizar JSON a VBScript y un método " Encode " para generar JSON a partir de VBScript. El código es algo largo, así que no lo pego aquí.

Demonio
fuente
Convertí los archivos vbs a asp. ¡Funciona maravillosamente! Limpio y sencillo. Muchas gracias Demon.
Marcos
Esta es la única solución que pude ponerme a trabajar usando IIS / IIS Express 8.5. Sospecho que ha habido cambios significativos en los compiladores ASP que han dejado obsoletas muchas de las otras respuestas.
Keith
4

Escribí esta respuesta cuando estaba buscando una solución única de VBScript pura y liviana.

Al armar un convertidor rudimentario de JSON a XML, podemos recorrer la cadena JSON y convertirla en un documento Microsoft.XMLDOM.

A partir de ahí, usamos la API XML de Microsoft, incluidas las consultas XPath, para extraer los valores que deseamos.

Esto maneja JSON simple, pero nunca pretendí esta respuesta para algo más sofisticado.

Para una solución más robusta, el mejor intérprete de JSON es un motor Javascript adecuado. Por lo tanto, recomiendo encarecidamente la respuesta aceptada a esta pregunta, es decir, ¿ alguna buena biblioteca para analizar JSON en ASP clásico?

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

El script anterior, transforma el siguiente JSON:

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

dentro:

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

Ahora podemos usar XPath para extraer tokenServicesUrl, por ejemplo:

dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
' Returns: "https://www.arcgis.com/sharing/rest/generateToken"
Stephen Quan
fuente
Esa es una idea interesante. ¡Gracias!
Mark Biek
1
¿Por qué convertir json a XML?
Brian White
@ brian-white, el pensamiento era, una vez que es XML, tienes la API completa de Microsoft XML DOM para hacer lo que sea.
Stephen Quan
Conviértalo en una clase :) Use algún código gen sobre el json para hacer una clase real y cárguela desde json. Entonces tienes todo el poder de un lenguaje de secuencias de comandos para hacer lo que quieras
Brian White
2

AX es una gran biblioteca, pero es bastante pesada si solo necesita la funcionalidad de procesamiento JSON.

Sin embargo, tomé el archivo base.asp y el archivo de clase json.asp del proyecto AX y los usé con éxito para implementar el análisis JSON en mi proyecto.

Para la generación JSON, encontré que aspjson era más simple de integrar. También tiene funciones relacionadas con json más potentes. La documentación del hacha es un poco escasa y fue más trabajo integrarla en el proyecto, sin embargo, hace un buen trabajo al serializar su objeto JSON VB de nuevo en una cadena.

Joe Niland
fuente
1
aspjson no analiza JSON, solo lo genera .
Mark Biek
Buen punto - actualicé mi respuesta para aclarar
Joe Niland
2

las soluciones aquí son muy buenas pero a veces exageradas. Si el JSON es simple y siempre tiene la misma estructura, puede analizarlo usted mismo, es rápido y simple.

 '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
pedro
fuente
Estaba tratando de encontrar una biblioteca JSON, cuando tu publicación me alejó de mi enfoque que no es KISS. Me di cuenta de que realmente iba a necesitar analizar un mensaje con un formato muy bien definido. Podría cortarlo y dividirlo en algo utilizable yo mismo. Gracias.
alphadogg