0

我有一个经典的 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 的标准 Windows 服务器。

4

1 回答 1

1

在 VBScript 中,如果要将对象引用分配给变量,则必须使用Set语句。更改此行:

Dim newSettings : newSettings = MergeJson(DefaultSettings, Settings)

Dim newSettings : Set newSettings = MergeJson(DefaultSettings, Settings)

如果没有Set,VBScript 会尝试将右侧强制转换为值类型,通常通过调用默认属性(如果存在)。在MergeJson函数的情况下,JScript 对象的默认属性似乎是toString函数,默认情况下,它返回字符串“[object typename ]”。这可以解释为什么newSettings在您不使用Set.

于 2013-07-23T06:06:55.073 回答