2012-08-28 12 views
12

Ich habe ein schnelles Entwicklungstool für ein ERP-System, das nur VBScript erlaubt. Ich versuche eine einfache AJAX-Anfrage mit VBS zu erstellen. Das hat mit dem "Microsoft.XMLHTTP" -Objekt funktioniert.JSON mit VBScript decodieren/codieren

Der nächste Schritt besteht darin, Daten von einem Webserver mit json zu empfangen. Aber in VBS scheint keine Funktion wie "json_decode" oder andere zu sein.

Kennt jemand eine Lösung? Oder ist die einzige Möglichkeit, meine eigene json-Funktion zu entwickeln?

+0

diese gebraucht, scheint in meinem Fall zu arbeiten: [demon.tw] (http://demon.tw/my-work/vbs-json.html#code) –

Antwort

8

Da JSON ein hierarchisches Datenformat ist, werden reguläre Ausdrücke und Split(), wie Peter vorgeschlagen hat, Sie nicht weit bringen.

Wenn Ihre Umgebung CreateObject() zulässt, können Sie möglicherweise ein fertiges COMponent in einer anderen Sprache verwenden (z. B. den Standard json2.js in eine .WSC- oder COM-.NET-DLL einbinden). Eine andere Option wäre die Verwendung einer anderen Sprache über Microsoft Script Control. Die Konsequenz dieses Ansatzes ist, dass Sie sich mit den Objekten/Arrays beschäftigen müssen, die von der anderen Sprache geliefert werden (einige Hinweise finden sich in dem von Peter referenzierten Thema).

Eine reine VBScript-Lösung kann here gefunden werden. Ich kann die Dokumentation nicht lesen, aber der Code kompiliert und funktioniert für einfache Testfälle - YMMV.

+0

Die Lösung von demon.tw großen Werke , aber die Leistung ist sehr langsam. Ich habe ein einfaches "Array" mit 10-15 einfachen Werten. Ein einzelnes Array enthält die Informationen eines Produkts. Ich habe 3500 Produkte, also muss ich die JSON-Kodierung 3500x mal ausführen. Für diese Aufgabe dauert es 2-3 Minuten. Ohne JSON-Encoding läuft es schnell, aber ich brauche dieses JSON-Format. Gibt es eine Möglichkeit, es zu beschleunigen? 30 Sekunden wären akzeptabel. –

+0

Ich habe das Problem gelöst, indem ich die JSON-Syntax manuell erstellt habe. Ich habe mich gerade den Strings selbst angeschlossen und sie mit JSON-Syntax umhüllt und einige Sonderzeichen entfernt. Die Leistung ist also großartig - und funktioniert in meinem Fall. –

+0

_e.g. Umbrechen Sie den Standard json2.js in einem .WSC oder COM aktivieren a.NET DLL_ Können Sie mich bitte auf die Website oder eine Dokumentation verweisen? – Gurman

0

Sie sollten besser Ihre eigene basierend auf einer Abfrage hier auf JSON und ASP. Wie zB diese Any good libraries for parsing JSON in Classic ASP? Die meiste Zeit json2-Bibliothek verwendet wird, aber dies basiert auf Jscript so keine Option für Sie. Auch die meiste Zeit hat diese Art von JSON eine feste Struktur, so dass es nicht so schwierig sein sollte, mit einer Regularexpression zu parsen, wie ich in einigen Antworten gezeigt habe, wie die obige. Sie könnten einige Ihrer JSON veröffentlichen, so dass wir es mit einigen Routinen testen können.

3

Ich hatte ein ähnliches Problem, also schrieb ich eine JSONtoXML-Funktion in VBScript für eines meiner Projekte. Keine Garantien für dieses Skript (es ist vorgesehen, wie sie ist und hat Grenzen bekannt sind, wie nicht alle Arten von Escape-Sequenzen Handling):

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

Danke für die tolle Funktion Stephen. Bitte überprüfen Sie unten das Projekt, das aus der Anpassung Ihrer Idee entstanden ist. https://github.com/pravynandas/JSONToXML – PravyNandas

8

Wie wäre es tut dies mit ASPJSON?
Verfügbar ab http://www.aspjson.com/

Ich bin über diese als Lösung für eine sehr alte Website zu verwenden, um einen Ajax-Aufruf (mit JQuery) mit den codierten Daten an eine MongoDB, für die Prüfung zu senden.

+1

Dies ist die beste Lösung, ihre Arbeit Gitter und die Leistung sind gut. –