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