1

Тема: AHK: Класс для работы с JSON

Создана аналогичная тема в Коллекции. Эта тема для возможной дискуссии, если в ней возникнет необходимость.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

2

Re: AHK: Класс для работы с JSON

Стоят упоминания моменты из другого обсуждения, начиная с этого, поднимающего эту тему?

3

Re: AHK: Класс для работы с JSON

В чем отличие от этого?

class JSON
{
	Decode(jsonStr)
	{
		SC := ComObjCreate("ScriptControl")
		SC.Language := "JScript"
		ComObjError(false)

		jsCode := "function arrangeForAhkTraversing(r){if(r instanceof Array){for(var a=0;a<r.length;++a)r[a]=arrangeForAhkTraversing(r[a]);return[" array ",r]}if(r instanceof Object){var n=[],e=[];for(var o in r)n.push(o),e.push(arrangeForAhkTraversing(r[o]));return[" object ",[n,e]]}return[typeof r,r]}"

		SC.ExecuteStatement(jsCode "; obj=" jsonStr)
		return this.convertJScriptObjToAhks( SC.Eval("arrangeForAhkTraversing(obj)") )
	}

	Encode(obj)
	{
		str := ""
		array := true
		for k in obj
		{
			if (k == A_Index)
				continue
			array := false
			break
		}
		for a, b in obj
			str .= (array ? "" : """" a """: ") . (IsObject(b) ? this.Encode(b) : """" b """") . ", "
		str := RTrim(str, " ,")
		return (array ? "[" str "]" : "{" str "}")
	}

	convertJScriptObjToAhks(jsObj)
	{
		if (jsObj[0] == "object")
		{
			obj := {}, keys := jsObj[1][0], values := jsObj[1][1]
			loop % keys.length
				obj[keys[A_INDEX-1]] := this.convertJScriptObjToAhks( values[A_INDEX-1] )
			return obj
		}
		else if (jsObj[0] == "array")
		{
			array := []
			loop % jsObj[1].length
				array.insert(this.convertJScriptObjToAhks( jsObj[1][A_INDEX-1] ))
			return array
		}
		else
			return jsObj[1]
	}
}
Мое вк: https://vk.com/perbuy_czar

4

Re: AHK: Класс для работы с JSON

KusochekDobra пишет:

Стоят упоминания моменты из другого обсуждения, начиная с этого, поднимающего эту тему?

Не знаю, вам как кажется? У меня обычно проблем не возникает, если учитывать, что JSON не поддерживает 16-ричные числа.

Phoenixxx_Czar пишет:

В чем отличие от этого?

Глвное отличие в том, что здесь используется объект ScriptControl, а он есть только для 32-битных приложений, соответственно, код не универсальный.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5

Re: AHK: Класс для работы с JSON

Ну а вообще по-простому для парсинга JSON можно такой вариант использовать:

json =
(
{
  "key": 6,
  "array": [1, 2, 3],
  "message": "Hello, World!"
}
)
oDoc := ComObjCreate("htmlfile")
oDoc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
try oDoc.parentWindow.eval("var message = JSON.parse('" . RegExReplace(json, "\R") . "').message;")
catch {
   MsgBox, Invalid json!
   Return
}
MsgBox, % oDoc.parentWindow.message
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg