class JSON
{
static JS := JSON._GetJScripObject()
decode(JsonString)
{
try
oJSON := this.JS.("(" JsonString ")")
catch
Return "Wrong JsonString!"
Return this._CreateObject(oJSON)
}
GetFromUrl(url, contentType := "", userAgent := "", body := "")
{
; в случае удачи будет возвращена JSON-строка, в случае ошибки — массив с одним элементом-строкой с описанием ошибки
try
{
XmlHttp := ComObjCreate("Microsoft.XmlHttp")
XmlHttp.Open("GET", url, false)
( contentType && XmlHttp.SetRequestHeader("Content-Type", contentType) )
( userAgent && XmlHttp.SetRequestHeader("User-Agent", userAgent) )
XmlHttp.Send(body)
}
catch e
Return ["Error!`n" . e.Message]
status := XmlHttp.Status
Return status = 200 ? XmlHttp.ResponseText : ["Error! Status: " . status . ", ResponseText: " . XmlHttp.ResponseText]
}
encode(obj)
{
Return this.JS.("JSON.stringify(" . this._ObjToString(obj) . ")")
}
_ObjToString(obj)
{
if IsObject(obj)
{
isArray := true
for key in obj
{
if IsObject(key)
Return "Invalid key"
if !(key = A_Index || isArray := false)
break
}
for k, v in obj
str .= (A_Index = 1 ? "" : ",") . (isArray ? "" : k . ":") . this._ObjToString(v)
Return isArray ? "[" str "]" : "{" str "}"
}
else if !(obj*1 = "" || RegExMatch(obj, "\s"))
Return obj
else
Return """" obj """"
}
_GetJScripObject()
{
static doc
doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
JS := ObjBindMethod(doc.parentWindow, "eval")
JSON._AddMethods(JS)
Return JS
}
_AddMethods(ByRef JS)
{
JScript =
(
Object.prototype.GetKeys = function ()
{
var keys = []
for (var k in this)
if (this.hasOwnProperty(k))
keys.push(k)
return keys
}
Object.prototype.IsArray = function ()
{
var toStandardString = {}.toString
return toStandardString.call(this) == '[object Array]'
}
)
JS.("delete ActiveXObject; delete GetObject;")
JS.(JScript)
}
_CreateObject(ObjJS)
{
res := ObjJS.IsArray()
if (res = "")
Return ObjJS
else if (res = -1)
{
obj := []
Loop % ObjJS.length
obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
}
else if (res = 0)
{
obj := {}
keys := ObjJS.GetKeys()
Loop % keys.length
k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
}
Return obj
}
}