合并两个json数组,服务器端javascript,经典asp

时间:2013-07-22 04:35:08

标签: json asp-classic vbscript jscript

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

1 个答案:

答案 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