我有一个经典的asp(vbscript)页面,我想加载并合并两个json文件(在递归上应用一个)。
<script language="JScript" runat="server">
function MergeJson(dest, src) {
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
try {
if ( src[prop].constructor==Object ) {
dest[prop] = MergeJson(dest[prop], src[prop]); // recurse
} else {
dest[prop] = src[prop]; // update
}
} catch(e) {
dest[prop] = src[prop]; // create
}
}
}
return dest;
}
</script>
当我执行客户端(在Chrome等中)时,上述功能正常运行。但是当我使用相同的功能并将其添加到服务器端时,它会失败。我的调用代码在VBScript中,如下所示:
Sub GetJSON(byval path, byref oJSON)
Dim str : str = GetFileString(Server.MapPath(path), "")
If str = "" Then str = "{}" ' empty object
Set oJSON = JSON.parse(join(array(str))) ' Douglas Crockford's json2.js
End Sub
Dim DefualtSettings : Call GetJSON("/defaults/settings.json", DefaultSettings)
Dim MySettings : Call GetJSON("/my/settings.json", MySettings)
Dim newSettings : newSettings = MergeJson(DefaultSettings, Settings)
response.write JSON.stringify(newSettings, null, 4) ' see it
我不确定为什么它没有幸免于过渡到服务器端代码。我已经检查过我正在正确加载json并且它能够被解析(因此它是有效的),并且执行基本相同的客户端工作正常......我不确定如何调试代码服务器端,我没有任何开发工具,它只是一个标准的IIS 7.5服务器。
答案 0 :(得分:1)
在VBScript中,如果要为变量分配对象引用,则必须使用Set
语句。改变这一行:
Dim newSettings : newSettings = MergeJson(DefaultSettings, Settings)
到
Dim newSettings : Set newSettings = MergeJson(DefaultSettings, Settings)
如果没有Set
,VBScript会尝试将右侧强制转换为值类型,通常是通过调用默认属性(如果存在)。对于MergeJson
函数,JScript对象的默认属性似乎是toString
函数,默认情况下返回字符串“[object typename ] ”。这可以解释为什么当您不使用newSettings
时将“[object Object]”分配给Set
。