2012-08-28 11 views
12

Mam szybkie narzędzie programistyczne dla systemu ERP, które pozwala tylko na vbscript. Próbuję utworzyć proste żądanie AJAX z VBS. To działało z obiektem "Microsoft.XMLHTTP".Dekodowanie/zakodowanie JSON z VBScript

Następnym krokiem jest otrzymanie danych z serwera WWW za pomocą json. Ale w VBS wydaje się, że nie ma żadnej innej funkcji, takiej jak "json_decode".

Czy ktoś zna rozwiązanie? Czy jest to jedyna opcja do opracowania mojej własnej funkcji json?

+0

użył tego, wydaje się działać w moim przypadku: [demon.tw] (http://demon.tw/my-work/vbs-json.html#code) –

Odpowiedz

8

Ponieważ JSON jest hierarchicznym formatem danych, użycie wyrażeń regularnych i podziału(), jak zaproponował Peter, nie dotrze daleko.

Jeśli Twoje środowisko zezwala na CreateObject(), możesz użyć gotowego COMpenta napisanego w innym języku (np. Owinąć standardowy plik json2.js w .WSC lub COM włączyć bibliotekę .NET DLL). Inną opcją byłoby wykorzystanie innego języka za pomocą Microsoft Script Control. Koniec tego podejścia polega na tym, że będziesz musiał radzić sobie z obiektami/tablicami dostarczonymi przez inny język (niektóre wskazówki można znaleźć w temacie, do którego odwołuje się Peter).

Czyste rozwiązanie VBScript można znaleźć here. Nie mogę odczytać dokumentacji, ale kod kompiluje się i "działa" dla prostych przypadków testowych - YMMV.

+0

Rozwiązanie z demon.tw działa świetnie , ale wydajność jest bardzo powolna. Mam prosty "Array" z 10-15 prostymi wartościami. Jedna pojedyncza tablica zawiera informacje o jednym produkcie. Mam 3500 produktów, więc muszę uruchomić kodowanie JSON 3500 razy. Do tego zadania zajmuje 2-3 minuty. Bez JSON-Encoding działa szybko, ale potrzebuję tego formatu JSON. Czy istnieje możliwość przyspieszenia? 30 sekund byłoby do zaakceptowania. –

+0

Rozwiązałem problem, ręcznie budując składnię JSON. Właśnie dołączyłem do samych łańcuchów i opakowałem je za pomocą składni JSON i uniknąłem specjalnych znaków. Więc wydajność jest świetna - i działa w moim przypadku. –

+0

_e.g. zawiń standardowy plik json2.js w rozszerzeniu .WSC lub COM a.NET DLL_ Czy możesz wskazać mi stronę lub jakąkolwiek dokumentację, jak to zrobić? – Gurman

0

Powinieneś lepiej wypróbować własne na podstawie zapytania tutaj na json i asp. Podobnie jak np. Ten jeden Any good libraries for parsing JSON in Classic ASP? W większości przypadków używa się biblioteki json2, ale jest to oparte na jscript, więc nie ma dla ciebie żadnej opcji. Również przez większość czasu ten rodzaj JSON ma ustaloną strukturę, więc nie powinno być tak trudno parsować z Regularexpression jak pokazałem w kilku odpowiedziach jak ten powyżej. Możesz opublikować część swojego JSON, abyśmy mogli przetestować go za pomocą pewnych procedur.

3

Miałem podobny problem, więc napisałem funkcję JSONtoXML w VBScript dla jednego z moich projektów. Brak gwarancji na tego skryptu (jest dostarczane jako-jest i znane ograniczenia, takie jak obsługa nie wszystkie rodzaje sekwencji 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

Dzięki za wspaniałą funkcję Stephen. Zapoznaj się z projektem, który powstał, dostosowując Twój pomysł. https://github.com/pravynandas/JSONToXML – PravyNandas

8

Jak o zrobieniu tego z ASPJSON?
Dostępne od http://www.aspjson.com/

mam zamiar to wykorzystać jako rozwiązanie dla bardzo starym miejscu, aby wysłać wywołanie AJAX (jQuery) z zakodowanych danych do MongoDB, do testowania.

+1

To najlepsze rozwiązanie, jego kratka robocza i wydajność są dobre. –