1

Тема: AHK: Преобразовать строку JSON в объект

Пост-задача, по типу прежнего "Прошу подключиться к решению загадки", но только для AHK, поэтому пишу здесь.
Вначале о том, что такое JSON, для тех, кто не знает:

JSON строится на двух структурах:

    Набор пар ключ/значение. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список с ключом или ассоциативный массив. Ключом может быть только строка, значением — любая форма.
    Пронумерованный набор значений. Во многих языках это реализовано как массив, вектор, список или последовательность.
... ... ...
В JSON используются их следующие формы:

    Объект — это неупорядоченное множество пар имя/значение, заключённое в фигурные скобки { }. Между именем и значением стоит символ ": ", а пары имя/значение разделяются запятыми.
    Массив (одномерный) — это множество значений, имеющих порядковые номера (индексы). Массив заключается в квадратные скобки [ ]. Значения отделяются запятыми.
    Значение может быть строкой в двойных кавычках, числом, значением true или false, объектом, массивом, или значением null. Эти структуры могут быть вложены друг в друга.
    Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки, с использованием escape-последовательностей начинающихся с обратной косой черты (backslash). Символы представляются простой строкой.
    Имя — это строка.

Строка очень похожа на строку в языках С и Java. Число тоже очень похоже на С или Java-число, за исключением того, что используется только десятичный формат. Пробелы могут быть вставлены между любыми двумя символами.

Следующий пример показывает JSON-представление объекта, описывающего человека. В объекте есть строковые поля имени и фамилии, объект, описывающий адрес, и массив, содержащий список телефонов.

{
   "firstName": "Иван",
   "lastName": "Иванов",
   "address": {
       "streetAddress": "Московское ш., 101, кв.101",
       "city": "Ленинград",
       "postalCode": 101101
   },
   "phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}

Именно в формате JSON приходит ответ от Google при работе скрипта из темы "Онлайн переводчик". Приходит, естественно, не в виде объекта, а в виде строки. Пример:

from := "ru"
to := "en"
Sourse := "ответ"

Url := "http://translate.google.com/translate_a/t?client=x&sl=" . from . "&tl=" . to . "&text=" URIEncode(Sourse)
Answer := UrlDownloadToVar(Url, "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")

Run, notepad.exe,,, PID
WinWait, ahk_class Notepad ahk_pid %PID%
ControlSetText, Edit1, %Answer%
return

URIEncode(Str)
{
   b_Format:=A_FormatInteger
   SetFormat, Integer, Hex
   Loop, % StrPutVar(Str, Var, "UTF-8")
   {
      Ch:=NumGet(Var, A_Index-1, "UChar")
      If Ch=0
         Break
      If (Ch>0x7f Or Ch<0x30 Or Ch=0x3d)
         s.="%"((StrLen(c:=SubStr(Ch, 3))<2) ? "0"c:c)
      Else
         s.=Chr(Ch)
   }
   SetFormat, Integer, % b_Format
   Return, s
}

StrPutVar(string, ByRef var, encoding = "CP0")
{
    ; Ensure capacity.
    VarSetCapacity( var, StrPut(string, encoding)
        ; StrPut returns char count, but VarSetCapacity needs bytes.
        * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
    ; Copy or convert the string.
    return StrPut(string, &var, encoding)
}

UrlDownloadToVar(URL, UserAgent = "")
{
   WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   WebRequest.Open("GET", Url)
   WebRequest.Option(WinHttpRequestOption_UserAgentString := 0) := UserAgent
   WebRequest.Send()
   Text := WebRequest.ResponseText
   WebRequest := ""
   return Text
}

В результате выполнения вышеприведённого скрипта появляется окно блокнота с текстом, который присылает Google в ответ на запрос перевести слово "ответ" с русского на английский.
Должно придти следующее:

{"sentences":[{"trans":"answer","orig":"ответ","translit":"","src_translit":"otvet"}],"dict":[{"pos":"noun","terms":["response","answer","reply","return","rejoinder","report","replication","rejoin","counterplea"],"entry":[{"word":"response","reverse_translation":["ответ","реакция","отклик","чувствительность","ответное чувство"],"synset_id":[3],"score":0.20316233},{"word":"answer","reverse_translation":["ответ","решение","возражение","реакция","письменные объяснения","дуплика"],"synset_id":[3],"score":0.17929012},{"word":"reply","reverse_translation":["ответ","реплика","ответ на контрмеморандум","ответ истца на возражение по иску","отчет"],"synset_id":[3],"score":0.070211023},{"word":"return","reverse_translation":["возврат","возвращение","ответ","рентабельность","прибыль","доход"],"synset_id":[1,6],"score":0.0043503456},{"word":"rejoinder","reverse_translation":["возражение","ответ","объединение","вторичное возражение ответчика","вторая состязательная бумага ответчика","дуплика"],"synset_id":[1],"score":0.000105558},{"word":"report","reverse_translation":["доклад","отчет","сообщение","протокол","рапорт","ответ"],"synset_id":[5],"score":9.6111653e-05},{"word":"replication","reverse_translation":["копирование","реплика","ответ","репродукция","копия","возражение"],"synset_id":[1],"score":8.4818232e-05},{"word":"rejoin","reverse_translation":["ответ"],"synset_id":[6],"score":3.9054989e-06},{"word":"counterplea","reverse_translation":["возражение","ответ"],"synset_id":[2],"score":1.9638082e-06}]},{"pos":"abbreviation","terms":["ans"],"entry":[{"word":"ans","reverse_translation":["ответ"],"synset_id":[4],"score":7.8444042e-05}]}],"src":"ru","server_time":2}

Отсюда задача: написать функцию, которая будет получать подобную строку в виде входного параметра и возвращать созданный из неё объект. Я, собственно, её уже решил, мне она показалась интересной, возможно, кто-то ещё захочет испытать свои силы.

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

2 (изменено: wisgest, 2012-11-29 02:52:09)

Re: AHK: Преобразовать строку JSON в объект

На JavaScript имеется быстрое и грязное  решение, не рекомендуемое к использованию в серьёзных приложениях из-за опасности инъекции вредоносного (или просто постороннего) кода.
Поскольку AHK теперь поддерживает COM-автоматизацию, ничто не мешает создать объекты ScriptControl или htmlfile или InternetExplorer…
Но это слишком простой путь и вероятно имелось в виду какое-то более творческое решение, требующее лучшего знания AHK.

3

Re: AHK: Преобразовать строку JSON в объект

wisgest пишет:

Поскольку AHK теперь поддерживает COM-автоматизацию, ничто не мешает создать объекты ScriptControl или htmlfile или InternetExplorer…

Думал об этом, но нехватает знаний. Что касается объекта ScriptControl, то вызов его не поддерживается из 64-битных приложений, вроде. С удовольствием посмотрел бы на решение задачи через COM каким-либо способом, кроме этого, даже на VBS. Сам сделал через парсинг.

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

4 (изменено: wisgest, 2012-11-29 05:52:15)

Re: AHK: Преобразовать строку JSON в объект

teadrinker пишет:

Что касается объекта ScriptControl, то вызов его не поддерживается из 64-битных приложений, вроде. С удовольствием посмотрел бы на решение задачи через COM каким-либо способом, кроме этого, даже на VBS.

Set htmldoc = CreateObject("htmlfile")
Set Script = htmldoc.Script ' то же, что htmldoc.parentWindow
Script.execScript "var eval = eval;", "JScript"

str = _
  "{" & _
  "   ""firstName"": ""Иван""," & _
  "   ""lastName"": ""Иванов""," & _
  "   ""address"": {" & _
  "       ""streetAddress"": ""Московское ш., 101, кв.101""," & _
  "       ""city"": ""Ленинград""," & _
  "       ""postalCode"": 101101" & _
  "   }," & _
  "   ""phoneNumbers"": [" & _
  "       ""812 123-1234""," & _
  "       ""916 123-4567""" & _
  "   ]" & _
  "}"

Set obj = Script.eval("(" & str & ")")
MsgBox obj.firstName
MsgBox obj.address.streetAddress

Для получения в VBS элементов JavaScript-массива или в общем случае свойств объекта, имеющих имена отличные от допустимого идентификатора, надо еще добавить в прототип Array или Object, соответственно, дополнительный метод

' ...
Script.execScript "Array.prototype.item = function (i) {return this[i];};", "JScript"
MsgBox obj.phoneNumbers.item(1)

Если AHK поддерживает в качестве имён свойств объекта произвольную строку (ассоциативные массивы), то этого, вероятно, можно не делать.

5 (изменено: teadrinker, 2012-11-29 12:00:30)

Re: AHK: Преобразовать строку JSON в объект

Спасибо, очень полезный пример.
Удалось перевести на AHK:

JSON =
(LTrim Join
   {
      "firstName": "Иван",
      "lastName": "Иванов",
      "address": {
          "streetAddress": "Московское ш., 101, кв.101",
          "city": "Ленинград",
          "postalCode": 101101
      },
      "phoneNumbers": [
          "812 123-1234",
          "916 123-4567"
      ]
   }
)

htmldoc := ComObjCreate("htmlfile")
Script := htmldoc.Script
Script.execScript(" ", "JScript")

oJSON := Script.eval("(" . JSON . ")")
MsgBox, % oJSON.address.streetAddress
MsgBox, % oJSON.phoneNumbers.0

А как здесь получить список ключей ("firstName", "lastName" и т. д.) ? Хотелось узнать, как обходить ключи-значения такого объекта с помощью цикла. Встроенный в AHK for key, value in Object выдаёт ошибку.

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

6

Re: AHK: Преобразовать строку JSON в объект

Хотя, вот, уже допёр:

JSON =
(LTrim Join
   {
      "firstName": "Иван",
      "lastName": "Иванов",
      "address": {
          "streetAddress": "Московское ш., 101, кв.101",
          "city": "Ленинград",
          "postalCode": 101101
      },
      "phoneNumbers": [
          "812 123-1234",
          "916 123-4567"
      ]
   }
)
 
htmldoc := ComObjCreate("htmlfile")
Script := htmldoc.Script
Script.execScript("Object.prototype.GetKeys = function () {keys = [],i = 0;for (k in this) { keys[++i] = k}; keys[0] = i;return keys}", "JScript")
 
oJSON := Script.eval("(" . JSON . ")")
keys := oJSON.GetKeys()
 
Loop % keys.0 - 1
   MsgBox, % "key = " . (k := keys[A_Index]) . "`nvalue = " . (IsObject(v := oJSON[k]) ? "Object" : v)

Т. е. считывание происходит внутри JScript в массив keys[]. А можно это сделать как-то извне?

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

7 (изменено: wisgest, 2012-11-29 14:39:03)

Re: AHK: Преобразовать строку JSON в объект

teadrinker пишет:
Object.prototype.GetKeys = function () {keys = [],i = 0;for (k in this) { keys[++i] = k}; keys[0] = i;return keys}

Массивы имееют свойство .length, так что их длину не обязательно хранить в нулевом элементе,
также желательно использовать метод .hasOwnProperty() для отсеивания свойств определённых в прототипах:

Object.prototype.GetKeys = function () {
  var keys = [];
  for (var k in this) {if (this.hasOwnProperty(k)) {keys[keys.length]=k;}}
  /* вместо keys[keys.length]=k можно использовать keys.push(k) */
  return keys;
};
teadrinker пишет:

Т. е. считывание происходит внутри JScript в массив keys[]. А можно это сделать как-то извне?

Для этого уже нужно знать AHK.

8

Re: AHK: Преобразовать строку JSON в объект

Спасибо! Буду разбираться.

JSON =
(LTrim Join
   {
      "firstName": "Иван",
      "lastName": "Иванов",
      "address": {
          "streetAddress": "Московское ш., 101, кв.101",
          "city": "Ленинград",
          "postalCode": 101101
      },
      "phoneNumbers": [
          "812 123-1234",
          "916 123-4567"
      ]
   }
)
 
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]'
   }
)
 
htmldoc := ComObjCreate("htmlfile")
Script := htmldoc.Script
Script.execScript(JScript)
 
oJSON := Script.eval("(" . JSON . ")")
keys := oJSON.GetKeys()
 
Loop % keys.length
   list .= (k := keys[A_Index-1]) . " = " . (IsObject(v := oJSON[k]) ? (v.IsArray() ? "Array[]" : "Object{}") : v) . "`n"
 
MsgBox, % list
wisgest пишет:
teadrinker пишет:

Т. е. считывание происходит внутри JScript в массив keys[]. А можно это сделать как-то извне?

Для этого уже нужно знать AHK.

А на VBS как? Точнее, правильнее было бы спросить, можно ли узнать имена свойств такого объекта, не определяя метод, считывающий их, внутри JScript?
И ещё, в чём разница между

  var keys = [];
  for (var k in this)

и

  keys = [];
  for (k in this)

ведь работает и так?

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

9

Re: AHK: Преобразовать строку JSON в объект

teadrinker пишет:

в чём разница <…> ведь работает и так?

Лишь в том, что при использовании необъявленной переменной она является глобальной.

teadrinker пишет:

А на VBS как? Точнее, правильнее было бы спросить, можно ли узнать имена свойств такого объекта, не определяя метод, считывающий их, внутри JScript?

На VBS нельзя перечислить имена свойств даже собственных объектов,
а наоборот из JS свойства объектов VBS можно:

<job>
<script language='VBScript'>
Class Point
  Public X, Y
End Class

Set A = New Point
</script>

<script language='JScript'>
for (var p in A) WScript.Echo(p);
</script>
</job>

В VBS имеется цикл For Each позволяющий перебирать сами элементы коллекций и массивов, но не произвольных объектов (он работает и с массивами JS).
Похоже, что в AHK цикл for in ближе к VBS-циклу For Each — он не перечисляет имена свойств объекта VBS:

htmldoc := ComObjCreate("htmlfile")
Script := htmldoc.Script
Script.execScript("Class Point:  Public X, Y:End Class:Public A: Set A = New Point", "VBScript")
 
for p, v in Script.A
  MsgBox % p

но перечисляет элементы VBS-массива:

htmldoc := ComObjCreate("htmlfile")
Script := htmldoc.Script
Script.execScript("Public A(2): A(0)=10: A(1)=20: A(2)=99", "VBScript")
 
for p, v in Script.A
  MsgBox, % p

10

Re: AHK: Преобразовать строку JSON в объект

Ну, раз никто больше не подключился, остаётся запостить свой вариант, несколько более громоздкий, но работающий быстрее:

JSON =
(LTrim Join
   {
      "firstName": "Иван",
      "lastName": "Иванов",
      "address": {
          "streetAddress": "Московское ш., 101, кв.101",
          "city": "Ленинград",
          "postalCode": 101101
      },
      "phoneNumbers": [
          "812 123-1234",
          "916 123-4567"
      ]
   }
)

for k, v in GetObjectFromJSON(JSON).address
   MsgBox, % k " = " v

GetObjectFromJSON(string)
{
   FirstSim := SubStr(string, 1, 1)
   mode := FirstSim = "{" ? "collection" : FirstSim = "[" ? "array" : FirstSim = """" ? ""
      . "str" : RegExMatch(FirstSim, "[\d]") ? "num" : "Error"
   if (mode = "collection")
   {
      Obj := {}, StartPos := 2
      While StartPos := RegExMatch(string, """(.*?)"":\s*", Found, StartPos)
      {
         RegExMatch(string, "P)([\[\{""\d])", Found_, StartPos += StrLen(Found))
         Content := GetContent(SubStr(string, StartPos))
         Obj[Found1] := GetObjectFromJSON(Content)
         StartPos := Found_Pos1 + StrLen(Content)
      }
   }
   else if (mode = "array")
   {
      Obj := [], StartPos := 2
      While RegExMatch(string, "P)([\[\{""\d])", Found_, StartPos)
      {
         Content := GetContent(SubStr(string, Found_Pos1))
         Obj.Insert(GetObjectFromJSON(Content))
         StartPos := Found_Pos1 + StrLen(Content)
      }
   }
   else if (mode = "str")
      Obj := RegExReplace(SubStr(string, 2, -1), "\\(.)", "$1")
   else if (mode = "num")
      Obj := string
   else
      MsgBox, Ошибка! Первый символ входящего объекта не может быть "%FirstSim%"!
   Return Obj
}

GetContent(string)
{
   FirstSim := SubStr(string, 1, 1)
   inverse := FirstSim = "{" ? "}" : FirstSim = "[" ? "]" : FirstSim = """" ? """" : ""
   if (inverse = "")
      Content := RegExReplace(string, "([\de.-]+).*", "$1")
   else if (inverse = """")
      Content := RegExReplace(string, "(.*?[^\\]"").*", "$1")
   else
   {
      i := 0
      Loop, parse, string
      {
         Content .= A_LoopField
         i += ((A_LoopField = FirstSim && PrevSim != "\") ? 1 : (A_LoopField = inverse && PrevSim != "\") ? -1 : 0)
         if i = 0
            break
         PrevSim := A_LoopField
      }
   }
   Return Content
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

11

Re: AHK: Преобразовать строку JSON в объект

По какой причине не обрабатывается JSON от VK API?

12

Re: AHK: Преобразовать строку JSON в объект

Я теперь таким пользуюсь:

str = {"response":{"count":1327,"items":[{"id":456239092,"album_id":43057155,"owner_id":-4410189,"user_id":468722286,"photo_75":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499d\/-WVOjdnpJZI.jpg","photo_130":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499e\/uQcruFXFMdk.jpg","photo_604":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499f\/y43rEl-TAkA.jpg","width":450,"height":600,"text":"","date":1516419054,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239078,"album_id":42994275,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c2\/zjw36aXGsrg.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c3\/6pqM4Ptzqzo.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c4\/bVjh384ZaLs.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331078,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239077,"album_id":203534724,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bb\/jUH3jjLme28.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bc\/dvTzcguDpI0.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bd\/6uf84mYlyu8.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331077,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239049,"album_id":43023085,"owner_id":-4410189,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe0\/8F1vthi-tjo.jpg","photo_130":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe1\/KxtmhBBZuY4.jpg","photo_604":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe2\/ZoT63tAPvHg.jpg","photo_807":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe3\/zbDlM4tkBS8.jpg","photo_1280":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe4\/sKgl1iXF-5o.jpg","width":877,"height":561,"text":"Эскиз к роману в стихах А.С.Пушкина \"Евгений Онегин\". Автор Lena Ashraf.","date":1492174953,"likes":{"user_likes":0,"count":1},"reposts":{"count":0}}]}}

obj := JSON.Parse(str)
MsgBox, % obj.response.items[1].id

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }
   
   Stringify(obj)  {
      if IsObject( obj )  {
         isArray := true
         for key in obj
            if !( key = A_Index || isArray := false )
               break
            
         for k, v in obj
            str .= ( A_Index = 1 ? "" : "," ) . ( isArray ? "" : this.Stringify(k) . ":" ) . this.Stringify(v)

         return isArray ? "[" str "]" : "{" str "}"
      }
      else if (obj*1)
         return obj
      
      for k, v in [["\", "\\"], [A_Tab, "\t"], ["""", "\"""], ["/", "\/"], ["`n", "\n"], ["`r", "\r"], [Chr(12), "\f"], [Chr(08), "\b"]]
         obj := StrReplace( obj, v[1], v[2] )
      
      while RegexMatch( obj, "[^\x20-\x7e]", key )  {
         str := Asc( key )
         val := "\u" . Chr( ( ( str >> 12 ) & 15 ) + ( ( ( str >> 12 ) & 15 ) < 10 ? 48 : 55 ) )
               . Chr( ( ( str >> 8 ) & 15 ) + ( ( ( str >> 8 ) & 15 ) < 10 ? 48 : 55 ) )
               . Chr( ( ( str >> 4 ) & 15 ) + ( ( ( str >> 4 ) & 15 ) < 10 ? 48 : 55 ) )
               . Chr( ( str & 15 ) + ( ( str & 15 ) < 10 ? 48 : 55 ) )
         obj := StrReplace(obj, key, val)
      }
      Return """" obj """"
   }
   
   GetFromUrl(url, body := "", contentType := "", userAgent := "")  {
      ; в случае удачи будет возвращена строка, в случае ошибки — массив с одним элементом-строкой с описанием ошибки
      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]
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      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
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg
+ DD

13 (изменено: DD, 2018-02-03 21:16:24)

Re: AHK: Преобразовать строку JSON в объект

Спасибо! А допустимо ли в коде выводить разом все нужные значения, в частности, —


"id":*
"owner_id":*
"photo_\d+": *
"text":"*"

...

где ссылка на фото — это ее более крупная версия?