- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 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
%>
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
类继承 — 或者至少 相同 对象
类。或者至少不要实现对它们执行 for ... in
所需的任何接口(interface)。
更新:虽然我觉得回答这个问题无关紧要 — 我希望某种网络客户端请求(通过 http)该对象的 JSON 表示或该对象的集合.
tl;dr 问题:我应该怎么做才能使 Scripting.Dictionary
正确输出为 JSON,而不是失败并返回一个空的字符串?我是否需要“重新发明轮子”并在 VBScript 中编写自己的 Dictionary
类,确实充当 ASP 中的普通对象?
最佳答案
Javascript 的 for...in
构造(在您引用的 JSON 序列化程序中使用)仅适用于 native JS 对象。枚举一个Scripting.Dictionary
的键,你需要使用 Enumerator对象,它将枚举字典的键。
现在 JSON.stringify
方法有一个允许自定义序列化的好方法,通过检查 toJSON
的存在。每个属性的方法。不幸的是,您不能像在 native JS 对象上那样在现有 COM 对象上添加新方法,所以这是行不通的。
然后是可以作为第二个参数传递给 stringify
的自定义字符串化函数方法调用。将为每个需要字符串化的对象调用该函数,即使对于每个嵌套对象也是如此。我认为可以在这里使用。
一个问题是(据我所知)JScript 无法自行区分 VBScript 类型。对于 JScript,任何 COM 或 VBScript 对象都有 typeof === 'object'
.我所知道的获取该信息的唯一方法是定义一个将返回类型名称的 VBS 函数。
由于经典 ASP 文件的执行顺序如下:
<script>
使用非默认脚本语言(在您的情况下为 JScript)的 block <script>
使用默认脚本语言(在您的情况下为 VBScript)的 block <% ... %>
block ,使用默认脚本语言(在您的情况下为 VBScript)以下可能有效——但仅当JSON.stringify
调用在 <% ... %>
内完成括号,因为这是唯一一次同时使用 JScript 和 VBScript <script>
部分都将被解析和执行。
最终的函数调用是这样的:
<%
Response.Write JSON.stringify(oProd, vbsStringifier)
%>
为了让 JScript 检查 COM 对象的类型,我们定义了一个 VBSTypeName 函数:
<script language="VBScript" runat="server">
Function VBSTypeName(Obj)
VBSTypeName = TypeName(Obj)
End Function
</script>
这里我们有作为第二个参数传递给 JSON.stringify 的 vbsStringifier 的完整实现:
<script language="JScript" runat="server">
function vbsStringifier(holder, key, value) {
if (VBSTypeName(value) === 'Dictionary') {
var result = '{';
for(var enr = new Enumerator(value); !enr.atEnd(); enr.moveNext()) {
key = enr.item();
result += '"' + key + '": ' + JSON.stringify(value.Item(key));
}
result += '}';
return result;
} else {
// return the value to let it be processed in the usual way
return value;
}
}
</script>
当然,在脚本引擎之间来回切换不是很有效(即从 JS 调用 VBS 函数,反之亦然),因此您可能希望尽量减少这种情况。
另请注意,我无法对此进行测试,因为我的机器上不再有 IIS。基本原理应该可行,我不是 100% 确定从 VBScript 传递 JScript 函数引用的可能性。您可能需要为 JScript 中的 JSON.stringify 调用编写一个小的自定义包装函数:
<script runat="server" language="JScript">
function JSONStringify(object) {
return JSON.stringify(object, vbsStringifier);
}
</script>
之后您可以简单地调整 VBScript 调用:
<%
Response.Write JSONStringify(oProd)
%>
关于javascript - JSON.Stringify 在 Scripting.Dictionary 对象上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5328858/
我知道 source 和 . 做同样的事情,如果标题中的其他命令对不一样,我会感到惊讶事情(因为我正在运行 bash 作为我的 shell,$SHELL [script] 和 bash [script
我在尝试启动第一个 super 账本网络时遇到此错误: $ ./byfn.sh -m up Starting with channel 'mychannel' and CLI timeout of '
哪个更好用或者更方便: ... 或 ... 最佳答案 你真的需要类型属性吗?如果您使用的是 HTML5,则不会。否则,是的。 HTML 4.01 和 XHTML 1.0 指定了 type属性是必需的,
哪个更好用或者更方便: ... 或 ... 最佳答案 你真的需要类型属性吗?如果您使用的是 HTML5,则不会。否则,是的。 HTML 4.01 和 XHTML 1.0 指定了 type属性是必需的,
使用此语法包含外部 javascript 文件的正确术语是什么: 是否包含script.js?执行了吗?是链接的吗?是叫吗?我刚刚运行了该文件吗? 最佳答案 我认为这里最常见的术语是加载外部 Jav
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why don't self-closing script tags work? 我刚刚发现 HTML 中的
没什么可说的了。我尝试寻找这意味着什么,但找不到。该脚本几个月来一直运行良好,并在 12 小时前停止,没有对其进行任何更改。手动运行显示此错误。 最佳答案 我遇到了同样的问题,我只需从脚本编辑器中单击
我是 Apps 脚本的新手,正在尝试了解使用另一个帐户在一个帐户中运行/触发脚本的基础知识。需要注意的是:我想在访问脚本的用户而不是拥有脚本的用户的情况下运行脚本——以便将运行时间分配给访问的用户。
我是 Apps 脚本的新手,正在尝试了解使用另一个帐户在一个帐户中运行/触发脚本的基础知识。需要注意的是:我想在访问脚本的用户而不是拥有脚本的用户的情况下运行脚本——以便将运行时间分配给访问的用户。
我最近遇到这个问题,我试图在我的 HTML 页面中导入多个 js 文件,如下 - 但我面临的问题是,它只加载第一个 js 文件,而其余的 js 文件没有加载。我还检查了浏览器中的网络部分,剩下的
Duplicate Why don’t self-closing script tags work? 我正在编写一个 ASP.net 页面,它在 JS 文件中有一些用于客户端身份验证的 Javascr
为什么以下行在许多浏览器(mozilla、IE)中不起作用? 为什么一定要这样设置? 最近我将我的项目从 XHTML 转换为 HTML5,我遇到了一些小但令人不安的不兼容性。 最佳答案 虽然脚本元
这个问题已经有答案了: Why don't self-closing script elements work? (12 个回答) 已关闭 7 年前。 经过两天的 Angular 与 Webpack
我在任何地方都找不到这个问题的答案;甚至在官方文档中也没有。我已经尝试自己编写代码,但它不起作用,所以它可能无法实现。 在下面的示例中,您可以使用条件颜色进行绘图: //STACKED EMAs
我正在通过串行端口使用 Tera Term 在板上进行一些测试。最近我发现我可以在 Tera Term 中编写一些脚本,所以我一直在做研究以帮助自动化并使测试更容易一些。 我知道 Tera Term
数组在 PineScript 中不可用。 有解决办法吗?有没有人开发过代码,作为数组使用? 我需要它做什么?我想计算每条趋势线或 S/R 水平的触及次数。 最佳答案 要实现计数器,您可以创建一个变量,
有没有办法创建一个指标来反射(reflect) Pine Script 中股票的当前价格?我需要这个指标,因为我需要在蜡烛关闭之前输入订单(当有特定的交叉时)并且回测数据是逐条提供的。我认为一个指标可
我的网站有一个脚本,如果从移动设备查看页面,格式和样式会发生变化。在网站的 2/3 页上,该脚本效果很好,正如我想要的那样。但是在最后一个上,用于更改格式和样式的脚本运行但未完全运行。我已经尝试从我的
我是否正确,市场上没有直接替代此流程: 在 chrome 插件商店中发布未列出 直接将链接分享给可以使用脚本的人 特别是,这些机制允许我使用我在所有 google dsoc 上编写的脚本。 随着转向市
我有一个简单的 Google Script 发布为具有匿名访问权限的网络应用程序。代码可用 here网络应用程序可用 here . code.gs function doGet() { retur
我是一名优秀的程序员,十分优秀!