<?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>https://forum.script-coding.com/viewtopic.php?id=10972</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10972&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Обработка переменной в формате JSON и перевод в массив».]]></description>
		<lastBuildDate>Thu, 24 Sep 2015 16:46:04 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=97671#p97671</link>
			<description><![CDATA[<p>А она чем-то лучше, чем мой вариант?<br />Не думаю, это просто <a href="https://raw.githubusercontent.com/cocobelgica/AutoHotkey-JSON/master/JSON.ahk">парсинг</a> строки.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 24 Sep 2015 16:46:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=97671#p97671</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=97669#p97669</link>
			<description><![CDATA[<p>А почему бы не воспользоваться <a href="https://github.com/cocobelgica/AutoHotkey-JSON">готовой библиотекой</a>?</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Thu, 24 Sep 2015 16:39:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=97669#p97669</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=97666#p97666</link>
			<description><![CDATA[<div class="quotebox"><cite>tuma4ok пишет:</cite><blockquote><p>если указан неполный путь до параметра, то отображались все его вложенные?</p></blockquote></div><p>А если вложенные тоже окажутся объектами? Или среди вложенных будут и строки, и объекты вместе?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 24 Sep 2015 14:51:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=97666#p97666</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=97664#p97664</link>
			<description><![CDATA[<p>Хм.. Все кажется идет хорошо, но можно ли как-то сделать так чтобы если указан неполный путь до параметра, то отображались все его вложенные?<br />Вот та же строка из кода:<br /></p><div class="codebox"><pre><code>json := &quot;{hello:&#039;world&#039;,its:{over:9000},foo:[&#039;bar&#039;,&#039;lol&#039;]}&quot;</code></pre></div><p>В <strong>foo</strong> хранится 2 значения, это <strong>bar</strong> и <strong>lol</strong>.<br />Мне нужно чтобы при таком коде:<br /></p><div class="codebox"><pre><code>MsgBox, % obj.foo</code></pre></div><p>Вывелся вот такой ответ:<br /></p><div class="codebox"><pre><code>[&#039;bar&#039;,&#039;lol&#039;]</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (tuma4ok)]]></author>
			<pubDate>Thu, 24 Sep 2015 14:30:44 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=97664#p97664</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=97657#p97657</link>
			<description><![CDATA[<div class="quotebox"><cite>tuma4ok пишет:</cite><blockquote><p>не знаю как правильно перевести переменную в формате JSON в массив</p></blockquote></div><div class="quotebox"><cite>tuma4ok пишет:</cite><blockquote><p>нашел один из примеров обработки json ответа</p></blockquote></div><p>Осталось совместить одно с другим:<br /></p><div class="codebox"><pre><code>string := &quot;{hello:&#039;world&#039;,its:{over:9000},foo:[&#039;bar&#039;]}&quot;

oJSON := jsonAHK(string)
MsgBox, % oJSON.hello &quot;`n&quot; oJSON.its.over &quot;`n&quot; oJSON.foo.0

jsonAHK(s){
    static o:=comobjcreate(&quot;scriptcontrol&quot;)
    o.language:=&quot;jscript&quot;
    return o.eval(&quot;(&quot; s &quot;)&quot;)
}</code></pre></div><p>Но так работать будет только под AHK x32, т. к. com-объект <em>ScriptControl</em> существует только в 32-битной версии. Кроме того, так мы получаем не AHK-объект, его ключи нельзя перебирать с помощью <em>for</em>. Вариант без этих недостатков:<br /></p><div class="codebox"><pre><code>json := &quot;{hello:&#039;world&#039;,its:{over:9000},foo:[&#039;bar&#039;,&#039;lol&#039;]}&quot;

obj := GetObjectFromJsonString(json)

MsgBox, % obj.hello &quot;`n&quot; obj.its.over &quot;`n&quot; obj.foo[1] &quot;`n&quot; obj.foo[2]

GetObjectFromJsonString(JsonString)
{
   JS := GetObjJScript()
   AddMethods(JS)
   try oJSON := JS.eval(&quot;(&quot; JsonString &quot;)&quot;)
   catch  {
      MsgBox, Неверный формат JsonString
      Return
   }
   Return CreateObject(oJSON)
}
   
GetObjJScript()
{
   if !FileExist(ComObjFile := A_ScriptDir &quot;\JS.wsc&quot;)
      FileAppend,
         (LTrim
            &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;
         ), % ComObjFile
   Return ComObjGet(&quot;script:&quot; . ComObjFile)
}

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.eval(&quot;delete ActiveXObject; delete GetObject;&quot;)
   JS.eval(JScript)
}

CreateObject(ObjJS)
{
   res := ObjJS.IsArray()
   if (res = &quot;&quot;)
      Return ObjJS
   
   else if (res = -1)  {
      obj := []
      Loop % ObjJS.length
         obj[A_Index] := CreateObject(ObjJS[A_Index - 1])
   }
   else if (res = 0)  {
      keys := ObjJS.GetKeys()
      obj := {}
      Loop % keys.length
         k := keys[A_Index - 1], obj[k] := CreateObject(ObjJS[k])
   }
   Return obj
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 24 Sep 2015 04:59:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=97657#p97657</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=97656#p97656</link>
			<description><![CDATA[<p>Здравствуйте, столкнулся с такой проблемой, не знаю как правильно перевести переменную в формате JSON в массив. То есть все должно выглядеть как-то так.<br />Пусть <strong>json</strong> будет переменной содержащей в себе JSON текст, а <strong>data</strong> пустой массив.<br /></p><div class="codebox"><pre><code>json:= &quot;{hello:&#039;world&#039;,its:{over:9000},foo:[&#039;bar&#039;,&#039;lol&#039;]}&quot;</code></pre></div><p>Мне нужно как-то этот ответ перевести в массив, чтобы он выглядел примерно вот-так.<br /></p><div class="codebox"><pre><code>data[hello] = world
data[its][over] = 9000
data[foo][0] = bar
data[foo][1] = lol</code></pre></div><p>Так же, может кому пригодиться, нашел один из примеров обработки json ответа.<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>jsonAHK(s){
    static o:=comobjcreate(&quot;scriptcontrol&quot;)
    o.language:=&quot;jscript&quot;
    return o.eval(&quot;(&quot; s &quot;)&quot;)
}
jsonBuild(j) { 
    for x,y in j
        s.=((a:=(j.setcapacity(0)=(j.maxindex()-j.minindex()+1)))?&quot;&quot;:x &quot;:&quot;)(isobject(y)?jsonBuild(y):y/y||y==0?y:&quot;&#039;&quot; y &quot;&#039;&quot;) &quot;,&quot;    
        ;s.=x &quot;:&quot; (isobject(y)?jsonBuild(y):y/y||y==0?y:&quot;&#039;&quot; y &quot;&#039;&quot;) &quot;,&quot;
    return (a?&quot;[&quot; rtrim(s,&quot;,&quot;) &quot;]&quot;:&quot;{&quot; rtrim(s,&quot;,&quot;) &quot;}&quot;)
    ;return (&quot;{&quot; rtrim(s,&quot;,&quot;) &quot;}&quot;)
}
jsonGet(s,k){
    static o:=comobjcreate(&quot;scriptcontrol&quot;)
    o.language:=&quot;jscript&quot;
    return o.eval(&quot;(&quot; s &quot;).&quot; k)
}

string := &quot;{hello:&#039;world&#039;,its:{over:9000},foo:[&#039;bar&#039;]}&quot;

msgbox,% jsonGet(string,&quot;hello&quot;)
msgbox,% jsonGet(string,&quot;its.over&quot;)
msgbox,% jsonGet(string,&quot;foo[0]&quot;)
ExitApp</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (tuma4ok)]]></author>
			<pubDate>Wed, 23 Sep 2015 13:41:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=97656#p97656</guid>
		</item>
	</channel>
</rss>
