我正在开发一个 ASP 经典项目,在该项目中我实现了 JScript JSON 类here。它能够与 VBScript 和 JScript 互操作,并且几乎与以下位置提供的代码完全相同:json.org。我的团队经理要求我在这个项目中使用 VBScript。
它非常适用于 ASP 中定义的基元和类。但我需要 Dictionary 对象,据我所知,这些对象只能通过 COM 互操作获得。 (通过Server.CreateObject("Scripting.Dictionary")
)我有以下代表产品的类:(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
%>
The Specs
属性是键:值对的字典。这是我对其进行序列化的方式:(product.asp)
<%
dim oProd
set oProd = new ProductInfo
' ... fill in properties
' ... output appropriate headers and stuff
Response.write( JSON.stringify( oProd ) )
%>
当我传递一个实例时ProductInfo
to JSON.Stringify
(如上所示)我得到类似以下内容:
{
"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": {}
}
如您所见,Specs
属性是一个空对象。我相信 JSON stringify 方法知道Specs
属性是一个对象,因此它附加了{}
到周围的 JSON 字符串字符串化的输出。在本例中是一个空字符串。然而,我期望它显示的并不是一个空物体。见下文:
"Specs": {
"foo":"bar",
"baz":1,
"etc":"..."
}
我相信 JSON 库的问题区域在这里:(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);
}
}
}
我假设上面代码的问题在于它假设所有对象都继承自Object
班级。 (提供的那个hasOwnProperty
)但是我认为 COM 对象很可能不会继承自Object
类——或者至少是same Object
班级。或者至少不要实现任何需要执行的接口for ... in
在他们。
Update:虽然我觉得这与要回答的问题无关——我希望某种 Web 客户端请求(通过 http)该对象的 JSON 表示形式或该对象的集合。
tl;博士 问题:我应该做什么才能使Scripting.Dictionary
可以正确输出为 JSON,而不是失败并仅返回空字符串?我需要“重新发明轮子”并编写自己的吗Dictionary
VBScript 中的类does充当 ASP 中的普通对象?