【发布时间】:2011-07-16 18:39:44
【问题描述】:
我正在开发一个 ASP 经典项目,我在其中实现了找到 here 的 JScript JSON 类。它能够与 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
%>
Specs 属性是一个键值对字典。这是我序列化它的方式:(product.asp)
<%
dim oProd
set oProd = new ProductInfo
' ... fill in properties
' ... output appropriate headers and stuff
Response.write( JSON.stringify( oProd ) )
%>
当我将ProductInfo 的实例传递给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 属性是一个对象,因此它将 {} 附加到 stringified 输出周围的 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 类继承——或者至少相同Object 类。或者至少不要实现对它们执行for ... in 所需的任何接口。
更新:虽然我觉得回答这个问题无关紧要 - 我希望某种网络客户端(通过 http)请求此对象的 JSON 表示或此对象的集合.
tl;dr 问题:我应该怎么做才能使Scripting.Dictionary 可以正确输出为 JSON,而不是失败并仅返回一个空字符串?我是否需要“重新发明轮子”并在 VBScript 中编写自己的 Dictionary 类,确实在 ASP 中充当普通对象?
【问题讨论】:
-
JSON 输出对我来说看起来非常好。目前尚不清楚问题是什么; JSON(字符串形式)将如何被消费?
-
@Pointy 我更新了 OP。我添加了 JSON 字符串的预期用途并澄清了问题所在。
标签: javascript json com asp-classic vbscript