0

2つのjsonファイルをロードしてマージしたい古典的なasp(vbscript)ページがあります(一方を他方に再帰的に適用します)。

<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 は、通常、既定のプロパティが存在する場合はそれを呼び出すことによって、右側を強制的に値の型にしようとします。関数の場合、MergeJsonJScript オブジェクトの既定のプロパティはtoString関数のようです。既定では、文字列 "[object typename ]" が返されます。newSettingsこれは、使用しないときに「[object Object]」が割り当てられている理由を説明しますSet

于 2013-07-23T06:06:55.073 に答える