parse - ¿Alguna buena biblioteca para analizar JSON en ASP clásico?
mostrar datos json javascript (8)
AX es una gran biblioteca, pero es bastante pesada si solo necesitas la funcionalidad de procesamiento JSON.
Sin embargo, tomé el archivo base.asp y el archivo de clase json.asp del proyecto AX y los utilicé con éxito para implementar el análisis JSON en mi proyecto.
Para la generación JSON, encontré que aspjson era más simple de integrar. También tiene funciones más potentes relacionadas con json. La documentación del hacha faltaba un poco y era más trabajo integrar en el proyecto, sin embargo, hace un buen trabajo al serializar su objeto JSON VB de nuevo en una cadena.
He podido encontrar un trillón de bibliotecas para generar JSON en ASP clásico (VBScript) pero no he encontrado NINGUNO para analizar .
Quiero algo que pueda pasar una cadena JSON y recuperar un objeto VBScript de algún tipo (Array, Scripting.Dictionary, etc.)
¿Alguien puede recomendar una biblioteca para analizar JSON en ASP clásico?
Escribí esta respuesta cuando buscaba una solución VBScript pura y liviana.
Al armar un convertidor JSON a XML rudimentario, podemos recorrer la cadena JSON y convertirla en un documento Microsoft.XMLDOM.
A partir de ahí, utilizamos la API XML de Microsoft, incluidas las consultas XPath para extraer cualquier valor que deseemos.
Esto maneja JSON simple, pero nunca intenté esta respuesta para algo más sofisticado.
Para una solución más robusta, el mejor intérprete JSON es un motor JavaScript adecuado. Por lo tanto, recomiendo la respuesta aceptada a esta pregunta, es decir, ¿hay buenas bibliotecas para analizar JSON en ASP clásico?
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
El script anterior, transforma el siguiente JSON:
{
"owningSystemUrl": "http://www.arcgis.com",
"authInfo": {
"tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
"isTokenBasedSecurity": true
}
}
dentro:
<xml owningSystemUrl="http://www.arcgis.com">
<authInfo
tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
isTokenBasedSecurity="true" >
</authInfo>
</xml>
Ahora podemos usar XPath para extraer tokenServicesUrl
, por ejemplo:
dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
'' Returns: "https://www.arcgis.com/sharing/rest/generateToken"
No estoy seguro de eso ¿Has comprobado el marco extremo ASP que tiene soporte JSON?
No pude lograr que la evolución extrema o la sugerencia de Chris Nielson funcionaran. Pero, lo siguiente funcionó para mí:
http://tforster.wik.is/ASP_Classic_Practices_For_The_21st_Century/JSON4ASP
Descargue lo siguiente como "json2.min.asp"
http://tforster.wik.is/@api/deki/files/2/=json2.min.asp
Agregue la siguiente línea al principio de su archivo ASP:
<script language="javascript" runat="server" src="json2.min.asp"></script>
Luego puede usar JSON en 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
Nota: Para analizar a través de una matriz de elementos, debe hacer lo siguiente:
for each iTmp in testing
if (TypeName(iTmp))<>"JScriptTypeInfo" then
Response.Write("Item: " & iTmp & "<br/>")
end if
next
Recientemente implementé una clase VbsJson , que tiene un método " Decode " para analizar JSON a VBScript y un método " Encode " para generar JSON desde VBScript. El código es algo largo, así que no lo pego aquí.
Tenga en cuenta que Classic ASP incluye JScript y VBScript. Curiosamente, puede analizar JSON utilizando JScript y usar los objetos resultantes directamente en VBScript.
Por lo tanto, es posible utilizar el https://github.com/douglascrockford/JSON-js/blob/master/json2.js canónico en el código del lado del servidor con cero modificaciones.
Por supuesto, si su JSON incluye matrices, estas seguirán siendo matrices JScript cuando se complete el análisis. Puede acceder al contenido de la matriz JScript desde VBScript utilizando la notación de puntos.
<%@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
%>
las soluciones aquí son muy buenas, pero a veces exageradas. Si el JSON es simple y siempre la misma estructura puede analizarlo usted mismo, es rápido y 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