JSON.Stringify falla en Scripting.Dictionary objetos
Estoy trabajando en un proyecto ASP clásico donde he implementado la clase JScript JSON encontradaaqu. Es capaz de interoperar con VBScript y JScript y es casi exactamente el código proporcionado en json.org. El gerente de mi equipo me exige que use VBScript para este proyecto.
Funciona muy bien en primitivas y clases definidas dentro de ASP. Pero necesito objetos de Diccionario que, según mi conocimiento, solo están disponibles a través de la interoperabilidad COM. (a través deServer.CreateObject("Scripting.Dictionary")
) Tengo la siguiente clase que representa un producto: (ProductInfo.class.asp)
<%
Class ProductInfo
Public ID
Public Category
Public PriceUS
Public PriceCA
Public Name
Public SKU
Public Overview
Public Features
Public Specs
End Class
%>
LosSpecs
property es un diccionario de clave: pares de valores. Así es como lo estoy serializando: (product.asp)
<%
dim oProd
set oProd = new ProductInfo
' ... fill in properties
' ... output appropriate headers and stuff
Response.write( JSON.stringify( oProd ) )
%>
Cuando paso una instancia deProductInfo
aJSON.Stringify
(como se ve arriba) me sale algo como lo siguiente:
{
"id": "1547",
"Category": {
"id": 101,
"Name": "Category Name",
"AlternateName": "",
"URL": "/category_name/",
"ParentCategoryID": 21
},
"PriceUS": 9.99,
"PriceCA": 11.99,
"Name": "Product Name",
"SKU": 3454536,
"Overview": "Lorem Ipsum dolor sit amet..",
"Features": "Lorem Ipsum dolor sit amet..",
"Specs": {}
}
omo puedes ver, laSpecs
propiedad es un objeto vacío. Creo que el método JSON stringify sabe que laSpecs
a propiedad @ es un objeto, por lo que agrega la{}
a la cadena JSON alrededor de la stringified salida. Que en este caso es una cadena vacía. Lo que espero que muestre, sin embargo, no es un objeto vacío. Vea abajo
"Specs": {
"foo":"bar",
"baz":1,
"etc":"..."
}
Creo que el área problemática de la biblioteca JSON está aquí: (json2.asp)
// Otherwise, iterate through all of the keys in the object.
for (k in value) {
if (Object.hasOwnProperty.call(value, k)) {
v = str(k, value);
if (v) {
partial.push(quote(k) + (gap ? ': ' : ':') + v);
}
}
}
ostulo que el problema con el código anterior es que supone que todos los objetos heredan de laObject
clase. (El que proporcionahasOwnProperty
) Sin embargo, creo que es probable que los objetos COM no hereden de laObject
clase - o al menos lamism Object
clase. O al menos no implemente la interfaz necesaria para hacerfor ... in
en ellos
Actualizar Si bien creo que es irrelevante que se responda la pregunta, espero que algún tipo de cliente web solicite (a través de http) la representación JSON de este objeto o una colección de este objeto.
tl; dr La pregunta: ¿Qué debo hacer para que elScripting.Dictionary
se puede generar correctamente como JSON en lugar de fallar y devolver solo una cadena vacía? ¿Necesito 'reinventar la rueda' y escribir mi propiaDictionary
clase en VBScript quehac ¿actúa como un objeto normal en ASP?