2012-08-28 16 views
12

Tengo una herramienta de desarrollo rápido para un sistema ERP, que solo permite vbscript. Intento crear una simple solicitud AJAX con VBS. Eso funcionó con el objeto "Microsoft.XMLHTTP".Decodificar/Codificar JSON con VBScript

El siguiente paso es recibir datos de un servidor web usando json. Pero en VBS parece que no hay función como "json_decode" o la otra.

¿Alguien sabe una solución? ¿O es la única opción para desarrollar mi propia función json?

+0

Se utiliza esto, parece funcionar en mi caso: [demon.tw] (http://demon.tw/my-work/vbs-json.html#code) –

Respuesta

8

Como JSON es un formato de datos jerárquico, el uso de expresiones regulares y Split(), como propuso Peter, no le llevará muy lejos.

Si su entorno permite CreateObject(), es posible que pueda usar un componente listo para usar escrito en otro idioma (por ejemplo, ajuste el estándar json2.js en .WSC o COM habilite una DLL .NET). Otra opción sería aprovechar otro idioma a través del control de secuencias de comandos de Microsoft. El inconveniente de este enfoque es que tendrás que ocuparte de los objetos/matrices entregados por el otro idioma (algunos consejos se encuentran en el tema al que Peter se refirió).

Se puede encontrar una solución VBScript pura here. No puedo leer la documentación, pero el código compila y 'funciona' para casos de prueba simples: YMMV.

+0

La solución de demon.tw grandes obras , pero el rendimiento es muy lento. Tengo un simple "Array" con 10-15 valores simples. Una sola matriz contiene la información de un producto. Tengo 3500 productos, así que tengo que ejecutar la codificación JSON 3500 veces. Para esta tarea, realiza 2-3 minutos. Sin JSON-Encoding funciona rápido, pero necesitaré este formato JSON. ¿Hay alguna posibilidad de acelerarlo? 30 segundos sería aceptable. –

+0

He resuelto el problema construyendo la sintaxis JSON manualmente. Acabo de unirme a las cadenas y las envolví con JSON-Syntax y escapé algunos caracteres especiales. Entonces, el rendimiento es excelente, y funciona en mi caso. –

+0

_e.g. envuelva el estándar json2.js en .WSC o COM habilite a.NET DLL_ ¿Puede indicarme el sitio web o cualquier documentación sobre cómo hacerlo? – Gurman

0

Debería implementar su propia herramienta basándose en una consulta aquí en json y asp. Como, por ejemplo, este Any good libraries for parsing JSON in Classic ASP? La mayoría de las veces se utiliza la biblioteca json2, pero esto se basa en jscript, por lo que no hay ninguna opción para usted. También la mayor parte del tiempo este tipo de JSON tiene una estructura fija por lo que no debería ser tan difícil analizar con una expresión regular como la que he demostrado en algunas respuestas como la anterior. Podría publicar algunos de sus JSON para que podamos probarlos con algunas rutinas.

3

Tuve un problema similar, así que escribí una función JSONtoXML en VBScript para uno de mis proyectos. No hay garantías en este script (se proporcionan tal como es y ha conocido limitaciones tales como no manejar todos los tipos de secuencias de escape):

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 
+0

Gracias por la gran función Stephen. Revise a continuación el proyecto que originó la adaptación de su idea. https://github.com/pravynandas/JSONToXML – PravyNandas

8

¿Cómo hacer esto con ASPJSON?
Disponible a partir http://www.aspjson.com/

que voy a utilizar esto como una solución para un sitio muy antiguo para enviar una llamada AJAX (jQuery) con los datos codificados a un MongoDB, para la prueba.

+1

Esta es la mejor solución, su trabajo y el rendimiento son buenos. –