Я работаю над классическим проектом ASP, где я реализовал класс 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
является объектом, поэтому он добавляет {}
в строку JSON вокруг вывода stringified .Который в этом случае является пустой строкой.То, что я ожидаю показать, однако это не пустой объект.См. Ниже:
"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 вместо сбоя и возврата только пустой строки?Нужно ли «изобретать велосипед» и писать свой собственный класс Dictionary
в VBScript, который действительно действует как обычный объект в ASP?