ASPでJSONパーサーを書いてみた
json.org で紹介されてるやつはなぜかエンコードのみ。
なもんで作ってみた。
parse() の返り値はObject(連想配列)がScripting.Dictionary, ArrayがVBの配列になってます。
ArrayとObjectの判定が完全じゃないのをなんとかしたい。
具体的にはObjectが「lengthをもち、かつその値がObjectの要素数と一致する」場合のみ誤判定する。
いい案がありましたら教えてください。
Class JSONparser Private m_js Public Sub Class_Initialize() Set m_js = CreateObject("ScriptControl") m_js.Language = "JScript" m_js.AddCode "function parse(str) { return eval('(' + str + ')'); }" m_js.AddCode "function getKeys(h) { var keys=[]; for(var k in h){keys.push(k);} return keys; };" End Sub Private Sub Class_Terminate() Set m_js = Nothing End Sub Public Function parse(json_str) Dim obj Set obj = m_js.CodeObject.parse(json_str) Set parse = CreateObject("Scripting.Dictionary") If TypeName(obj) = "JScriptTypeInfo" Then Call toValue(obj, parse) Else parse = false End If End Function Private Sub toValue(ByRef obj, ByRef ret) Dim keys, k, v, is_array If TypeName(obj) <> "JScriptTypeInfo" Then ret = obj Else is_array = false Set keys = m_js.CodeObject.getKeys(obj) On Error Resume Next is_array = eval("obj.length = keys.length") On Error GoTo 0 If is_array Then ret = toArray(obj) Else Set ret = CreateObject("Scripting.Dictionary") For Each k In toArray(keys) Execute "Call toValue(obj." & k & ", v)" If VarType(v) = 9 Then Set ret(k) = v Else ret(k) = v Next End If End If End Sub Private Function toArray(ByRef obj) Dim i, arr() Redim arr(obj.length - 1) For i=0 To obj.length-1 Execute "Call toValue(obj.[" & i & "], arr(i))" Next toArray = arr End Function End Class