<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Преобразовать строку JSON в объект]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=7824</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7824&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Преобразовать строку JSON в объект».]]></description>
		<lastBuildDate>Sat, 03 Feb 2018 17:15:07 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=123573#p123573</link>
			<description><![CDATA[<p>Спасибо! А допустимо ли в коде выводить разом все нужные значения, в частности, —<br /></p><div class="codebox"><pre><code>
&quot;id&quot;:*
&quot;owner_id&quot;:*
&quot;photo_\d+&quot;: *
&quot;text&quot;:&quot;*&quot;

...
</code></pre></div><p>где ссылка на фото — это ее более крупная версия?</p>]]></description>
			<author><![CDATA[null@example.com (DD)]]></author>
			<pubDate>Sat, 03 Feb 2018 17:15:07 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=123573#p123573</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=123572#p123572</link>
			<description><![CDATA[<p>Я теперь таким пользуюсь:<br /></p><div class="codebox"><pre><code>str = {&quot;response&quot;:{&quot;count&quot;:1327,&quot;items&quot;:[{&quot;id&quot;:456239092,&quot;album_id&quot;:43057155,&quot;owner_id&quot;:-4410189,&quot;user_id&quot;:468722286,&quot;photo_75&quot;:&quot;https:\/\/pp.userapi.com\/c840126\/v840126582\/7499d\/-WVOjdnpJZI.jpg&quot;,&quot;photo_130&quot;:&quot;https:\/\/pp.userapi.com\/c840126\/v840126582\/7499e\/uQcruFXFMdk.jpg&quot;,&quot;photo_604&quot;:&quot;https:\/\/pp.userapi.com\/c840126\/v840126582\/7499f\/y43rEl-TAkA.jpg&quot;,&quot;width&quot;:450,&quot;height&quot;:600,&quot;text&quot;:&quot;&quot;,&quot;date&quot;:1516419054,&quot;likes&quot;:{&quot;user_likes&quot;:0,&quot;count&quot;:0},&quot;reposts&quot;:{&quot;count&quot;:0}},{&quot;id&quot;:456239078,&quot;album_id&quot;:42994275,&quot;owner_id&quot;:-4410189,&quot;user_id&quot;:178805115,&quot;photo_75&quot;:&quot;https:\/\/pp.userapi.com\/c639429\/v639429115\/286c2\/zjw36aXGsrg.jpg&quot;,&quot;photo_130&quot;:&quot;https:\/\/pp.userapi.com\/c639429\/v639429115\/286c3\/6pqM4Ptzqzo.jpg&quot;,&quot;photo_604&quot;:&quot;https:\/\/pp.userapi.com\/c639429\/v639429115\/286c4\/bVjh384ZaLs.jpg&quot;,&quot;width&quot;:600,&quot;height&quot;:300,&quot;text&quot;:&quot;http:\/\/fas.st\/UF5a3&quot;,&quot;date&quot;:1498331078,&quot;likes&quot;:{&quot;user_likes&quot;:0,&quot;count&quot;:0},&quot;reposts&quot;:{&quot;count&quot;:0}},{&quot;id&quot;:456239077,&quot;album_id&quot;:203534724,&quot;owner_id&quot;:-4410189,&quot;user_id&quot;:178805115,&quot;photo_75&quot;:&quot;https:\/\/pp.userapi.com\/c639429\/v639429115\/286bb\/jUH3jjLme28.jpg&quot;,&quot;photo_130&quot;:&quot;https:\/\/pp.userapi.com\/c639429\/v639429115\/286bc\/dvTzcguDpI0.jpg&quot;,&quot;photo_604&quot;:&quot;https:\/\/pp.userapi.com\/c639429\/v639429115\/286bd\/6uf84mYlyu8.jpg&quot;,&quot;width&quot;:600,&quot;height&quot;:300,&quot;text&quot;:&quot;http:\/\/fas.st\/UF5a3&quot;,&quot;date&quot;:1498331077,&quot;likes&quot;:{&quot;user_likes&quot;:0,&quot;count&quot;:0},&quot;reposts&quot;:{&quot;count&quot;:0}},{&quot;id&quot;:456239049,&quot;album_id&quot;:43023085,&quot;owner_id&quot;:-4410189,&quot;user_id&quot;:100,&quot;photo_75&quot;:&quot;https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe0\/8F1vthi-tjo.jpg&quot;,&quot;photo_130&quot;:&quot;https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe1\/KxtmhBBZuY4.jpg&quot;,&quot;photo_604&quot;:&quot;https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe2\/ZoT63tAPvHg.jpg&quot;,&quot;photo_807&quot;:&quot;https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe3\/zbDlM4tkBS8.jpg&quot;,&quot;photo_1280&quot;:&quot;https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe4\/sKgl1iXF-5o.jpg&quot;,&quot;width&quot;:877,&quot;height&quot;:561,&quot;text&quot;:&quot;Эскиз к роману в стихах А.С.Пушкина \&quot;Евгений Онегин\&quot;. Автор Lena Ashraf.&quot;,&quot;date&quot;:1492174953,&quot;likes&quot;:{&quot;user_likes&quot;:0,&quot;count&quot;:1},&quot;reposts&quot;:{&quot;count&quot;:0}}]}}

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

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.(&quot;(&quot; JsonString &quot;)&quot;)
      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 ? &quot;&quot; : &quot;,&quot; ) . ( isArray ? &quot;&quot; : this.Stringify(k) . &quot;:&quot; ) . this.Stringify(v)

         return isArray ? &quot;[&quot; str &quot;]&quot; : &quot;{&quot; str &quot;}&quot;
      }
      else if (obj*1)
         return obj
      
      for k, v in [[&quot;\&quot;, &quot;\\&quot;], [A_Tab, &quot;\t&quot;], [&quot;&quot;&quot;&quot;, &quot;\&quot;&quot;&quot;], [&quot;/&quot;, &quot;\/&quot;], [&quot;`n&quot;, &quot;\n&quot;], [&quot;`r&quot;, &quot;\r&quot;], [Chr(12), &quot;\f&quot;], [Chr(08), &quot;\b&quot;]]
         obj := StrReplace( obj, v[1], v[2] )
      
      while RegexMatch( obj, &quot;[^\x20-\x7e]&quot;, key )  {
         str := Asc( key )
         val := &quot;\u&quot; . Chr( ( ( str &gt;&gt; 12 ) &amp; 15 ) + ( ( ( str &gt;&gt; 12 ) &amp; 15 ) &lt; 10 ? 48 : 55 ) )
               . Chr( ( ( str &gt;&gt; 8 ) &amp; 15 ) + ( ( ( str &gt;&gt; 8 ) &amp; 15 ) &lt; 10 ? 48 : 55 ) )
               . Chr( ( ( str &gt;&gt; 4 ) &amp; 15 ) + ( ( ( str &gt;&gt; 4 ) &amp; 15 ) &lt; 10 ? 48 : 55 ) )
               . Chr( ( str &amp; 15 ) + ( ( str &amp; 15 ) &lt; 10 ? 48 : 55 ) )
         obj := StrReplace(obj, key, val)
      }
      Return &quot;&quot;&quot;&quot; obj &quot;&quot;&quot;&quot;
   }
   
   GetFromUrl(url, body := &quot;&quot;, contentType := &quot;&quot;, userAgent := &quot;&quot;)  {
      ; в случае удачи будет возвращена строка, в случае ошибки — массив с одним элементом-строкой с описанием ошибки
      try  {
         XmlHttp := ComObjCreate(&quot;Microsoft.XmlHttp&quot;)
         XmlHttp.Open(&quot;GET&quot;, url, false)
         ( contentType &amp;&amp; XmlHttp.SetRequestHeader(&quot;Content-Type&quot;, contentType) )
         ( userAgent &amp;&amp; XmlHttp.SetRequestHeader(&quot;User-Agent&quot;, userAgent) )
         XmlHttp.Send(body)
      }
      catch e
         Return [&quot;Error!`n&quot; . e.Message]
      status := XmlHttp.Status
      Return status = 200 ? XmlHttp.ResponseText : [&quot;Error! Status: &quot; . status . &quot;, ResponseText: &quot; . XmlHttp.ResponseText]
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, (MAX_PATH := 260) &lt;&lt; !!A_IsUnicode, 0)
      DllCall(&quot;GetTempFileName&quot;, Str, A_Temp, Str, &quot;AHK&quot;, UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      &lt;component&gt;
      &lt;public&gt;&lt;method name=&#039;eval&#039;/&gt;&lt;/public&gt;
      &lt;script language=&#039;JScript&#039;&gt;&lt;/script&gt;
      &lt;/component&gt;
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet(&quot;script:&quot; . tmpFile), &quot;eval&quot; )
      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) == &#039;[object Array]&#039;
         }
      )
      JS.(&quot;delete ActiveXObject; delete GetObject;&quot;)
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = &quot;&quot;)
         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
   }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 03 Feb 2018 16:56:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=123572#p123572</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=123563#p123563</link>
			<description><![CDATA[<p>По какой причине не обрабатывается <a href="http://forum.script-coding.com/viewtopic.php?pid=123557#p123557">JSON от VK API</a>?</p>]]></description>
			<author><![CDATA[null@example.com (DD)]]></author>
			<pubDate>Sat, 03 Feb 2018 15:07:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=123563#p123563</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66378#p66378</link>
			<description><![CDATA[<p>Ну, раз никто больше не подключился, остаётся запостить свой вариант, несколько более громоздкий, но работающий быстрее:<br /></p><div class="codebox"><pre><code>JSON =
(LTrim Join
   {
      &quot;firstName&quot;: &quot;Иван&quot;,
      &quot;lastName&quot;: &quot;Иванов&quot;,
      &quot;address&quot;: {
          &quot;streetAddress&quot;: &quot;Московское ш., 101, кв.101&quot;,
          &quot;city&quot;: &quot;Ленинград&quot;,
          &quot;postalCode&quot;: 101101
      },
      &quot;phoneNumbers&quot;: [
          &quot;812 123-1234&quot;,
          &quot;916 123-4567&quot;
      ]
   }
)

for k, v in GetObjectFromJSON(JSON).address
   MsgBox, % k &quot; = &quot; v

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

GetContent(string)
{
   FirstSim := SubStr(string, 1, 1)
   inverse := FirstSim = &quot;{&quot; ? &quot;}&quot; : FirstSim = &quot;[&quot; ? &quot;]&quot; : FirstSim = &quot;&quot;&quot;&quot; ? &quot;&quot;&quot;&quot; : &quot;&quot;
   if (inverse = &quot;&quot;)
      Content := RegExReplace(string, &quot;([\de.-]+).*&quot;, &quot;$1&quot;)
   else if (inverse = &quot;&quot;&quot;&quot;)
      Content := RegExReplace(string, &quot;(.*?[^\\]&quot;&quot;).*&quot;, &quot;$1&quot;)
   else
   {
      i := 0
      Loop, parse, string
      {
         Content .= A_LoopField
         i += ((A_LoopField = FirstSim &amp;&amp; PrevSim != &quot;\&quot;) ? 1 : (A_LoopField = inverse &amp;&amp; PrevSim != &quot;\&quot;) ? -1 : 0)
         if i = 0
            break
         PrevSim := A_LoopField
      }
   }
   Return Content
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 02 Dec 2012 07:44:30 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66378#p66378</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66306#p66306</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>в чём разница &lt;…&gt; ведь работает и так?</p></blockquote></div><p>Лишь в том, что при использовании необъявленной переменной она является глобальной.<br /></p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>А на VBS как? Точнее, правильнее было бы спросить, можно ли узнать имена свойств такого объекта, не определяя метод, считывающий их, внутри JScript?</p></blockquote></div><p>На VBS нельзя перечислить имена свойств даже собственных объектов,<br />а наоборот из JS свойства объектов VBS можно:<br /></p><div class="codebox"><pre><code>&lt;job&gt;
&lt;script language=&#039;VBScript&#039;&gt;
Class Point
  Public X, Y
End Class

Set A = New Point
&lt;/script&gt;

&lt;script language=&#039;JScript&#039;&gt;
for (var p in A) WScript.Echo(p);
&lt;/script&gt;
&lt;/job&gt;</code></pre></div><p>В VBS имеется цикл For Each позволяющий перебирать сами элементы коллекций и массивов, но не произвольных объектов (он работает и с массивами JS).<br />Похоже, что в AHK цикл for in ближе к VBS-циклу For Each — он не перечисляет имена свойств объекта VBS:<br /></p><div class="codebox"><pre><code>htmldoc := ComObjCreate(&quot;htmlfile&quot;)
Script := htmldoc.Script
Script.execScript(&quot;Class Point:  Public X, Y:End Class:Public A: Set A = New Point&quot;, &quot;VBScript&quot;)
 
for p, v in Script.A
  MsgBox % p</code></pre></div><p>но перечисляет элементы VBS-массива:<br /></p><div class="codebox"><pre><code>htmldoc := ComObjCreate(&quot;htmlfile&quot;)
Script := htmldoc.Script
Script.execScript(&quot;Public A(2): A(0)=10: A(1)=20: A(2)=99&quot;, &quot;VBScript&quot;)
 
for p, v in Script.A
  MsgBox, % p</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Fri, 30 Nov 2012 10:42:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66306#p66306</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66290#p66290</link>
			<description><![CDATA[<p>Спасибо! Буду разбираться.<br /></p><div class="codebox"><pre><code>JSON =
(LTrim Join
   {
      &quot;firstName&quot;: &quot;Иван&quot;,
      &quot;lastName&quot;: &quot;Иванов&quot;,
      &quot;address&quot;: {
          &quot;streetAddress&quot;: &quot;Московское ш., 101, кв.101&quot;,
          &quot;city&quot;: &quot;Ленинград&quot;,
          &quot;postalCode&quot;: 101101
      },
      &quot;phoneNumbers&quot;: [
          &quot;812 123-1234&quot;,
          &quot;916 123-4567&quot;
      ]
   }
)
 
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) == &#039;[object Array]&#039;
   }
)
 
htmldoc := ComObjCreate(&quot;htmlfile&quot;)
Script := htmldoc.Script
Script.execScript(JScript)
 
oJSON := Script.eval(&quot;(&quot; . JSON . &quot;)&quot;)
keys := oJSON.GetKeys()
 
Loop % keys.length
   list .= (k := keys[A_Index-1]) . &quot; = &quot; . (IsObject(v := oJSON[k]) ? (v.IsArray() ? &quot;Array[]&quot; : &quot;Object{}&quot;) : v) . &quot;`n&quot;
 
MsgBox, % list</code></pre></div><div class="quotebox"><cite>wisgest пишет:</cite><blockquote><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Т. е. считывание происходит внутри JScript в массив <em>keys[]</em>. А можно это сделать как-то извне?</p></blockquote></div><p>Для этого уже нужно знать AHK.</p></blockquote></div><p>А на VBS как? Точнее, правильнее было бы спросить, можно ли узнать имена свойств такого объекта, не определяя метод, считывающий их, внутри JScript?<br />И ещё, в чём разница между<br /></p><div class="codebox"><pre><code>  var keys = [];
  for (var k in this)</code></pre></div><p>и <br /></p><div class="codebox"><pre><code>  keys = [];
  for (k in this)</code></pre></div><p>ведь работает и так?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Nov 2012 13:08:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66290#p66290</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66288#p66288</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><div class="codebox"><pre><code>Object.prototype.GetKeys = function () {keys = [],i = 0;for (k in this) { keys[++i] = k}; keys[0] = i;return keys}</code></pre></div></blockquote></div><p>Массивы имееют свойство <em>.length</em>, так что их длину не обязательно хранить в нулевом элементе,<br />также желательно использовать метод <em>.hasOwnProperty()</em> для отсеивания свойств определённых в прототипах:<br /></p><div class="codebox"><pre><code>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;
};</code></pre></div><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Т. е. считывание происходит внутри JScript в массив <em>keys[]</em>. А можно это сделать как-то извне?</p></blockquote></div><p>Для этого уже нужно знать AHK.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Thu, 29 Nov 2012 10:25:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66288#p66288</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66269#p66269</link>
			<description><![CDATA[<p>Хотя, вот, уже допёр:<br /></p><div class="codebox"><pre><code>JSON =
(LTrim Join
   {
      &quot;firstName&quot;: &quot;Иван&quot;,
      &quot;lastName&quot;: &quot;Иванов&quot;,
      &quot;address&quot;: {
          &quot;streetAddress&quot;: &quot;Московское ш., 101, кв.101&quot;,
          &quot;city&quot;: &quot;Ленинград&quot;,
          &quot;postalCode&quot;: 101101
      },
      &quot;phoneNumbers&quot;: [
          &quot;812 123-1234&quot;,
          &quot;916 123-4567&quot;
      ]
   }
)
 
htmldoc := ComObjCreate(&quot;htmlfile&quot;)
Script := htmldoc.Script
Script.execScript(&quot;Object.prototype.GetKeys = function () {keys = [],i = 0;for (k in this) { keys[++i] = k}; keys[0] = i;return keys}&quot;, &quot;JScript&quot;)
 
oJSON := Script.eval(&quot;(&quot; . JSON . &quot;)&quot;)
keys := oJSON.GetKeys()
 
Loop % keys.0 - 1
   MsgBox, % &quot;key = &quot; . (k := keys[A_Index]) . &quot;`nvalue = &quot; . (IsObject(v := oJSON[k]) ? &quot;Object&quot; : v)</code></pre></div><p>Т. е. считывание происходит внутри JScript в массив <em>keys[]</em>. А можно это сделать как-то извне?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Nov 2012 06:39:57 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66269#p66269</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66260#p66260</link>
			<description><![CDATA[<p>Спасибо, очень полезный пример. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Удалось перевести на AHK:<br /></p><div class="codebox"><pre><code>JSON =
(LTrim Join
   {
      &quot;firstName&quot;: &quot;Иван&quot;,
      &quot;lastName&quot;: &quot;Иванов&quot;,
      &quot;address&quot;: {
          &quot;streetAddress&quot;: &quot;Московское ш., 101, кв.101&quot;,
          &quot;city&quot;: &quot;Ленинград&quot;,
          &quot;postalCode&quot;: 101101
      },
      &quot;phoneNumbers&quot;: [
          &quot;812 123-1234&quot;,
          &quot;916 123-4567&quot;
      ]
   }
)

htmldoc := ComObjCreate(&quot;htmlfile&quot;)
Script := htmldoc.Script
Script.execScript(&quot; &quot;, &quot;JScript&quot;)

oJSON := Script.eval(&quot;(&quot; . JSON . &quot;)&quot;)
MsgBox, % oJSON.address.streetAddress
MsgBox, % oJSON.phoneNumbers.0</code></pre></div><p>А как здесь получить список ключей (&quot;firstName&quot;, &quot;lastName&quot; и т. д.) ? Хотелось узнать, как обходить ключи-значения такого объекта с помощью цикла. Встроенный в AHK <em>for key, value in Object</em> выдаёт ошибку.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 29 Nov 2012 02:30:58 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66260#p66260</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66259#p66259</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Что касается объекта ScriptControl, то вызов его не поддерживается из 64-битных приложений, вроде. С удовольствием посмотрел бы на решение задачи через COM каким-либо способом, кроме этого, даже на VBS.</p></blockquote></div><div class="codebox"><pre><code>Set htmldoc = CreateObject(&quot;htmlfile&quot;)
Set Script = htmldoc.Script &#039; то же, что htmldoc.parentWindow
Script.execScript &quot;var eval = eval;&quot;, &quot;JScript&quot;

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

Set obj = Script.eval(&quot;(&quot; &amp; str &amp; &quot;)&quot;)
MsgBox obj.firstName
MsgBox obj.address.streetAddress</code></pre></div><p>Для получения в VBS элементов JavaScript-массива или в общем случае свойств объекта, имеющих имена отличные от допустимого идентификатора, надо еще добавить в прототип <em>Array</em> или <em>Object</em>, соответственно, дополнительный метод<br /></p><div class="codebox"><pre><code>&#039; ...
Script.execScript &quot;Array.prototype.item = function (i) {return this[i];};&quot;, &quot;JScript&quot;
MsgBox obj.phoneNumbers.item(1)</code></pre></div><p>Если AHK поддерживает в качестве имён свойств объекта произвольную строку (ассоциативные массивы), то этого, вероятно, можно не делать.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Thu, 29 Nov 2012 00:20:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66259#p66259</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66257#p66257</link>
			<description><![CDATA[<div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>Поскольку AHK теперь поддерживает COM-автоматизацию, ничто не мешает создать объекты ScriptControl или htmlfile или InternetExplorer…</p></blockquote></div><p>Думал об этом, но нехватает знаний. Что касается объекта ScriptControl, то вызов его не поддерживается из 64-битных приложений, вроде. С удовольствием посмотрел бы на решение задачи через COM каким-либо способом, кроме этого, даже на VBS. Сам сделал через парсинг.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 28 Nov 2012 22:53:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66257#p66257</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66256#p66256</link>
			<description><![CDATA[<p>На JavaScript имеется быстрое и грязное&nbsp; решение, не рекомендуемое к использованию в серьёзных приложениях из-за опасности инъекции вредоносного (или просто постороннего) кода.<br />Поскольку AHK теперь поддерживает COM-автоматизацию, ничто не мешает создать объекты ScriptControl или htmlfile или InternetExplorer…<br />Но это слишком простой путь и вероятно имелось в виду какое-то более творческое решение, требующее лучшего знания AHK.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Wed, 28 Nov 2012 22:44:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66256#p66256</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Преобразовать строку JSON в объект]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66255#p66255</link>
			<description><![CDATA[<p>Пост-задача, по типу прежнего &quot;Прошу подключиться к решению загадки&quot;, но только для AHK, поэтому пишу здесь.<br />Вначале о том, что такое <a href="http://ru.wikipedia.org/wiki/JSON">JSON</a>, для тех, кто не знает:<br /></p><div class="quotebox"><blockquote><p>JSON строится на двух структурах:</p><p>&nbsp; &nbsp; Набор пар ключ/значение. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список с ключом или ассоциативный массив. Ключом может быть только строка, значением — любая форма.<br />&nbsp; &nbsp; Пронумерованный набор значений. Во многих языках это реализовано как массив, вектор, список или последовательность.<br />... ... ...<br />В JSON используются их следующие формы:</p><p>&nbsp; &nbsp; Объект — это неупорядоченное множество пар имя/значение, заключённое в фигурные скобки { }. Между именем и значением стоит символ &quot;: &quot;, а пары имя/значение разделяются запятыми.<br />&nbsp; &nbsp; Массив (одномерный) — это множество значений, имеющих порядковые номера (индексы). Массив заключается в квадратные скобки [ ]. Значения отделяются запятыми.<br />&nbsp; &nbsp; Значение может быть строкой в двойных кавычках, числом, значением true или false, объектом, массивом, или значением null. Эти структуры могут быть вложены друг в друга.<br />&nbsp; &nbsp; Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки, с использованием escape-последовательностей начинающихся с обратной косой черты (backslash). Символы представляются простой строкой.<br />&nbsp; &nbsp; Имя — это строка.</p><p>Строка очень похожа на строку в языках С и Java. Число тоже очень похоже на С или Java-число, за исключением того, что используется только десятичный формат. Пробелы могут быть вставлены между любыми двумя символами.</p><p>Следующий пример показывает JSON-представление объекта, описывающего человека. В объекте есть строковые поля имени и фамилии, объект, описывающий адрес, и массив, содержащий список телефонов.</p><div class="quotebox"><blockquote><p>{<br />&nbsp; &nbsp;&quot;firstName&quot;: &quot;Иван&quot;,<br />&nbsp; &nbsp;&quot;lastName&quot;: &quot;Иванов&quot;,<br />&nbsp; &nbsp;&quot;address&quot;: {<br />&nbsp; &nbsp; &nbsp; &nbsp;&quot;streetAddress&quot;: &quot;Московское ш., 101, кв.101&quot;,<br />&nbsp; &nbsp; &nbsp; &nbsp;&quot;city&quot;: &quot;Ленинград&quot;,<br />&nbsp; &nbsp; &nbsp; &nbsp;&quot;postalCode&quot;: 101101<br />&nbsp; &nbsp;},<br />&nbsp; &nbsp;&quot;phoneNumbers&quot;: [<br />&nbsp; &nbsp; &nbsp; &nbsp;&quot;812 123-1234&quot;,<br />&nbsp; &nbsp; &nbsp; &nbsp;&quot;916 123-4567&quot;<br />&nbsp; &nbsp;]<br />}</p></blockquote></div></blockquote></div><p>Именно в формате JSON приходит ответ от Google при работе скрипта из темы &quot;<a href="http://forum.script-coding.com/viewtopic.php?pid=65572#p65572">Онлайн переводчик</a>&quot;. Приходит, естественно, не в виде объекта, а в виде строки. Пример:<br /></p><div class="codebox"><pre><code>from := &quot;ru&quot;
to := &quot;en&quot;
Sourse := &quot;ответ&quot;

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

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, &quot;UTF-8&quot;)
   {
      Ch:=NumGet(Var, A_Index-1, &quot;UChar&quot;)
      If Ch=0
         Break
      If (Ch&gt;0x7f Or Ch&lt;0x30 Or Ch=0x3d)
         s.=&quot;%&quot;((StrLen(c:=SubStr(Ch, 3))&lt;2) ? &quot;0&quot;c:c)
      Else
         s.=Chr(Ch)
   }
   SetFormat, Integer, % b_Format
   Return, s
}

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

UrlDownloadToVar(URL, UserAgent = &quot;&quot;)
{
   WebRequest := ComObjCreate(&quot;WinHttp.WinHttpRequest.5.1&quot;)
   WebRequest.Open(&quot;GET&quot;, Url)
   WebRequest.Option(WinHttpRequestOption_UserAgentString := 0) := UserAgent
   WebRequest.Send()
   Text := WebRequest.ResponseText
   WebRequest := &quot;&quot;
   return Text
}</code></pre></div><p>В результате выполнения вышеприведённого скрипта появляется окно блокнота с текстом, который присылает Google в ответ на запрос перевести слово &quot;ответ&quot; с русского на английский.<br />Должно придти следующее:<br /></p><div class="quotebox"><blockquote><p>{&quot;sentences&quot;:[{&quot;trans&quot;:&quot;answer&quot;,&quot;orig&quot;:&quot;ответ&quot;,&quot;translit&quot;:&quot;&quot;,&quot;src_translit&quot;:&quot;otvet&quot;}],&quot;dict&quot;:[{&quot;pos&quot;:&quot;noun&quot;,&quot;terms&quot;:[&quot;response&quot;,&quot;answer&quot;,&quot;reply&quot;,&quot;return&quot;,&quot;rejoinder&quot;,&quot;report&quot;,&quot;replication&quot;,&quot;rejoin&quot;,&quot;counterplea&quot;],&quot;entry&quot;:[{&quot;word&quot;:&quot;response&quot;,&quot;reverse_translation&quot;:[&quot;ответ&quot;,&quot;реакция&quot;,&quot;отклик&quot;,&quot;чувствительность&quot;,&quot;ответное чувство&quot;],&quot;synset_id&quot;:[3],&quot;score&quot;:0.20316233},{&quot;word&quot;:&quot;answer&quot;,&quot;reverse_translation&quot;:[&quot;ответ&quot;,&quot;решение&quot;,&quot;возражение&quot;,&quot;реакция&quot;,&quot;письменные объяснения&quot;,&quot;дуплика&quot;],&quot;synset_id&quot;:[3],&quot;score&quot;:0.17929012},{&quot;word&quot;:&quot;reply&quot;,&quot;reverse_translation&quot;:[&quot;ответ&quot;,&quot;реплика&quot;,&quot;ответ на контрмеморандум&quot;,&quot;ответ истца на возражение по иску&quot;,&quot;отчет&quot;],&quot;synset_id&quot;:[3],&quot;score&quot;:0.070211023},{&quot;word&quot;:&quot;return&quot;,&quot;reverse_translation&quot;:[&quot;возврат&quot;,&quot;возвращение&quot;,&quot;ответ&quot;,&quot;рентабельность&quot;,&quot;прибыль&quot;,&quot;доход&quot;],&quot;synset_id&quot;:[1,6],&quot;score&quot;:0.0043503456},{&quot;word&quot;:&quot;rejoinder&quot;,&quot;reverse_translation&quot;:[&quot;возражение&quot;,&quot;ответ&quot;,&quot;объединение&quot;,&quot;вторичное возражение ответчика&quot;,&quot;вторая состязательная бумага ответчика&quot;,&quot;дуплика&quot;],&quot;synset_id&quot;:[1],&quot;score&quot;:0.000105558},{&quot;word&quot;:&quot;report&quot;,&quot;reverse_translation&quot;:[&quot;доклад&quot;,&quot;отчет&quot;,&quot;сообщение&quot;,&quot;протокол&quot;,&quot;рапорт&quot;,&quot;ответ&quot;],&quot;synset_id&quot;:[5],&quot;score&quot;:9.6111653e-05},{&quot;word&quot;:&quot;replication&quot;,&quot;reverse_translation&quot;:[&quot;копирование&quot;,&quot;реплика&quot;,&quot;ответ&quot;,&quot;репродукция&quot;,&quot;копия&quot;,&quot;возражение&quot;],&quot;synset_id&quot;:[1],&quot;score&quot;:8.4818232e-05},{&quot;word&quot;:&quot;rejoin&quot;,&quot;reverse_translation&quot;:[&quot;ответ&quot;],&quot;synset_id&quot;:[6],&quot;score&quot;:3.9054989e-06},{&quot;word&quot;:&quot;counterplea&quot;,&quot;reverse_translation&quot;:[&quot;возражение&quot;,&quot;ответ&quot;],&quot;synset_id&quot;:[2],&quot;score&quot;:1.9638082e-06}]},{&quot;pos&quot;:&quot;abbreviation&quot;,&quot;terms&quot;:[&quot;ans&quot;],&quot;entry&quot;:[{&quot;word&quot;:&quot;ans&quot;,&quot;reverse_translation&quot;:[&quot;ответ&quot;],&quot;synset_id&quot;:[4],&quot;score&quot;:7.8444042e-05}]}],&quot;src&quot;:&quot;ru&quot;,&quot;server_time&quot;:2}</p></blockquote></div><p>Отсюда <span class="bbu">задача</span>: написать функцию, которая будет получать подобную строку в виде входного параметра и возвращать созданный из неё объект. Я, собственно, её уже решил, мне она показалась интересной, возможно, кто-то ещё захочет испытать свои силы. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 28 Nov 2012 22:03:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66255#p66255</guid>
		</item>
	</channel>
</rss>
