ASP( VBScript ) 解析 JSON

ASP( VBScript ) 解析 JSON
VBScript 是 ASP 服务端程序的常用语言.
VBScript 解析 JSON是个问题. 自己写解析程序,当然不容易.

碰到这问题, 第一个想到的就是 JScript 了.
<script language="jscript" runat="server"> Array.prototype.get = function(x) { return this[x]; }; function parseJSON(strJSON) { return eval("(" + strJSON + ")"); } </script> <% Dim json, obj json = "{a:""aaa"", b:{ name:""bb"", value:""text"" }, c:[""item0"", ""item1"", ""item2""]}" Set obj = parseJSON(json) Response.Write obj.a & "<br />" Response.Write obj.b.name & "<br />" Response.Write obj.c.length & "<br />" Response.Write obj.c.get(0) & "<br />" Set obj = Nothing %>这是直接在 asp 里混用脚本.
还有一个方法就是 使用 MS 的 脚本控件.
也一样是使用了 JScript
Dim scriptCtrl Function parseJSON(str) If Not IsObject(scriptCtrl) Then Set scriptCtrl = Server.CreateObject("MSScriptControl.ScriptControl") scriptCtrl.Language = "JScript" scriptCtrl.AddCode "Array.prototype.get = function(x) { return this[x]; }; var result = null;" End If scriptCtrl.ExecuteStatement "result = " & str & ";" Set parseJSON = scriptCtrl.CodeObject.result End Function Dim json json = "{a:""aaa"", b:{ name:""bb"", value:""text"" }, c:[""item0"", ""item1"", ""item2""]}" Set obj = parseJSON(json) Response.Write obj.a & "<br />" Response.Write obj.b.name & "<br />" Response.Write obj.c.length & "<br />" Response.Write obj.c.get(0) & "<br />" Set obj = Nothing Set scriptCtrl = Nothing


--------------- 2009.12.31 ---------------

之前写这个时,还忽略了一个问题.

上面二个方法都使用了 jscript 把 json 串解析成 js 对象.

不同之处是, 第一个方法, eval 是在当前宿主环境中执行.
第二个方法是, 在另外的宿主环境中执行.

这涉及到了一个安全性问题. json 如果是从客户端提交上来的话, 难以保证没有恶意用户提交非法代码...
这样,第一个方法,就会在当前环境中 eval(...恶意代码...) 后果不堪设想!!!

第二个方法,创建了 ScriptControl 控件, 在里面执行代码则相对安全了, 因为是在一个隔离起来的环境中执行.
但还有两个东东要给先卡掉, 因为代码在 ScriptControl 中执行,也可以在里面使用 ActiveXObject 或 GetObject 与外界打交道..
仍然不安全.

这时候,就有必要再调整一下代码:
Dim scriptCtrl Function parseJSON(str) If Not IsObject(scriptCtrl) Then Set scriptCtrl = Server.CreateObject("MSScriptControl.ScriptControl") scriptCtrl.Language = "JScript" scriptCtrl.AddCode "function ActiveXObject() {}" ' 覆盖 ActiveXObject scriptCtrl.AddCode "function GetObject() {}" ' 覆盖 ActiveXObject scriptCtrl.AddCode "Array.prototype.get = function(x) { return this[x]; }; var result = null;" End If On Error Resume Next scriptCtrl.ExecuteStatement "result = " & str & ";" Set parseJSON = scriptCtrl.CodeObject.result If Err Then Err.Clear Set parseJSON = Nothing End If End Function Dim json json = "{a:""aaa"", b:{ name:""bb"", value:""text"" }, c:[""item0"", ""item1"", ""item2""]}" Set obj = parseJSON(json) Response.Write obj.a & "<br />" Response.Write obj.b.name & "<br />" Response.Write obj.c.length & "<br />" Response.Write obj.c.get(0) & "<br />" Set obj = Nothing If IsObject(scriptCtrl) Then Set scriptCtrl = Nothing

你可能感兴趣的:(ASP( VBScript ) 解析 JSON)