web-dev-qa-db-fra.com

Avez-vous de bonnes bibliothèques pour analyser JSON dans ASP classique?

J'ai été en mesure de trouver une bibliothèque zillion pour génération JSON dans Classic ASP (VBScript) mais je n'ai pas été trouvé de TOUT pour analyse.

Je veux quelque chose que je puisse passer une chaîne JSON et récupérer un objet VBScript quelconque (Array, Scripting.Dictionary, etc.)

Quelqu'un peut-il recommander une bibliothèque pour analyser JSON dans Classic ASP?

72
Mark Biek

Gardez à l'esprit que Classic ASP inclut JScript ainsi que VBScript. Fait intéressant, vous pouvez analyser JSON en utilisant JScript et utiliser les objets résultants directement dans VBScript.

Par conséquent, il est possible d'utiliser le canonique https://github.com/douglascrockford/JSON-js/blob/master/json2.js dans le code côté serveur sans aucune modification.

Bien sûr, si votre JSON comprend des tableaux, ceux-ci resteront des tableaux JScript une fois l'analyse terminée. Vous pouvez accéder au contenu du tableau JScript à partir de VBScript à l'aide de la notation par points.

<%@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
%>
84
Chris Nielsen

Je n'en suis pas sûr. Avez-vous vérifié ASP extreme framework qui prend en charge JSON?

15
Shoban

Je n'ai pas réussi à faire fonctionner l'évolution extrême ou la suggestion de Chris Nielson. Mais, ce qui suit a fonctionné pour moi:

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

Téléchargez ce qui suit en tant que "json2.min.asp"

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

Ajoutez la ligne suivante en haut de votre fichier ASP:

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

Vous pouvez ensuite utiliser JSON dans 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

Remarque: pour analyser un tableau d'éléments, vous devez procéder comme suit:

   for each iTmp in testing
       if (TypeName(iTmp))<>"JScriptTypeInfo" then 
           Response.Write("Item: " &  iTmp & "<br/>")
       end if
   next
13
seanyboy

J'ai récemment implémenté une classe VbsJson , qui a une décodage " "méthode pour analyser JSON en VBScript et une méthode" Encode "pour générer JSON à partir de VBScript. Le code est un peu long, donc je ne le colle pas ici.

7
Demon
4
Hasan Köroğlu

J'ai écrit cette réponse lorsque je cherchais une solution pure VBScript pure et légère.

En assemblant un convertisseur JSON à XML rudimentaire, nous pouvons parcourir la chaîne JSON et la transformer en document Microsoft.XMLDOM.

À partir de là, nous utilisons l'API XML de Microsoft, y compris les requêtes XPath, pour extraire toutes les valeurs souhaitées.

Cela gère le JSON simple, mais je n'ai jamais voulu que cette réponse soit plus sophistiquée.

Pour une solution plus robuste, le meilleur interpréteur JSON est un moteur Javascript approprié. Par conséquent, je recommande fortement la réponse acceptée à cette question, c'est-à-dire Toutes les bonnes bibliothèques pour analyser JSON dans Classic ASP?

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

Le script ci-dessus transforme le JSON suivant:

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

dans:

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

Nous pouvons maintenant utiliser XPath pour extraire le tokenServicesUrl, par exemple:

dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
' Returns: "https://www.arcgis.com/sharing/rest/generateToken"
3
Stephen Quan

les solutions ici sont très bonnes mais parfois excessives. Si le JSON est simple et toujours la même structure que vous pouvez l'analyser vous-même, c'est rapide et 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
2
peter

AX est une excellente bibliothèque mais est plutôt lourde si vous avez juste besoin d'une fonctionnalité de traitement JSON.

J'ai cependant récupéré le fichier base.asp et le fichier de classe json.asp du projet AX et les ai utilisés avec succès pour implémenter l'analyse JSON dans mon projet.

Pour la génération JSON, j'ai trouvé aspjson était plus simple à intégrer. Il possède également des fonctionnalités liées à json plus puissantes. La documentation hache manquait un peu et était plus de travail à intégrer dans le projet, mais elle fait un bon travail de sérialisation de son objet JSON VB en une chaîne).

2
Joe Niland