web-dev-qa-db-fra.com

Décoder / encoder JSON avec VBScript

J'ai un outil de développement rapide pour un système ERP, qui ne permet que vbscript. J'essaie de créer une simple demande AJAX avec VBS. Cela fonctionnait avec l'objet "Microsoft.XMLHTTP".

L'étape suivante consiste à recevoir des données d'un serveur Web à l'aide de json. Mais dans VBS, il ne semble pas y avoir de fonction comme "json_decode" ou autre.

Quelqu'un connaît-il une solution? Ou est-ce la seule option pour développer ma propre fonction json?

16
Stefan Brendle

Comme JSON est un format de données hiérarchique, l'utilisation d'expressions régulières et de Split (), comme Peter l'a proposé, ne vous mènera pas loin.

Si votre environnement autorise CreateObject(), vous pourrez peut-être utiliser un composant COM prêt à l'emploi écrit dans une autre langue (par exemple, envelopper le json2.js standard dans un .WSC ou COM activer une DLL .NET). Une autre option serait d'exploiter une autre langue via le Microsoft Script Control. L'inconvénient de cette approche est que vous devrez traiter avec les objets/tableaux fournis par l'autre langue (certaines astuces se trouvent dans le sujet auquel Peter a fait référence).

Une solution VBScript pure peut être trouvée ici . Je ne peux pas lire la documentation, mais le code compile et "fonctionne" pour les cas de test simples - YMMV.

9
Ekkehard.Horner

Que diriez-vous de faire cela avec ASPJSON?
Disponible sur http://www.aspjson.com/

Je suis sur le point de l'utiliser comme solution pour un très ancien site pour envoyer un appel ajax (en utilisant Jquery) avec les données encodées à un MongoDB, pour le test.

8
Logan

J'ai eu un problème similaire, j'ai donc écrit une fonction JSONtoXML dans VBScript pour l'un de mes projets. Aucune garantie sur ce script (il est fourni en l'état et comporte des limitations connues telles que la non-gestion de tous les types de séquences d'échappement):

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
3
Stephen Quan

Découvrez https://github.com/rcdmk/aspJSON

Je ne sais pas si cela a un lien avec www.ASPJSON.com (maintenant disparu) mentionné dans la réponse de Logan.

0
Keith

Vous devriez mieux déployer le vôtre sur la base d'une requête ici sur json et asp. Comme par exemple celui-ci Toutes les bonnes bibliothèques pour analyser JSON dans Classic ASP? La plupart du temps la bibliothèque json2 est utilisée mais elle est basée sur jscript donc aucune option pour vous. De plus, la plupart du temps, ce type de JSON a une structure fixe, il ne devrait donc pas être si difficile d'analyser une expression régulière comme je l'ai démontré dans quelques réponses comme celle ci-dessus. Vous pouvez publier une partie de votre JSON afin que nous puissions le tester avec certaines routines.

0
peter