<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10972&amp;type=atom" />
	<updated>2015-09-24T16:46:04Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10972</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=97671#p97671" />
			<content type="html"><![CDATA[<p>А она чем-то лучше, чем мой вариант?<br />Не думаю, это просто <a href="https://raw.githubusercontent.com/cocobelgica/AutoHotkey-JSON/master/JSON.ahk">парсинг</a> строки.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-24T16:46:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=97671#p97671</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=97669#p97669" />
			<content type="html"><![CDATA[<p>А почему бы не воспользоваться <a href="https://github.com/cocobelgica/AutoHotkey-JSON">готовой библиотекой</a>?</p>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2015-09-24T16:39:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=97669#p97669</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=97666#p97666" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>tuma4ok пишет:</cite><blockquote><p>если указан неполный путь до параметра, то отображались все его вложенные?</p></blockquote></div><p>А если вложенные тоже окажутся объектами? Или среди вложенных будут и строки, и объекты вместе?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-24T14:51:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=97666#p97666</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=97664#p97664" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[tuma4ok]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32022</uri>
			</author>
			<updated>2015-09-24T14:30:44Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=97664#p97664</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=97657#p97657" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2015-09-24T04:59:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=97657#p97657</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Обработка переменной в формате JSON и перевод в массив]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=97656#p97656" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[tuma4ok]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=32022</uri>
			</author>
			<updated>2015-09-23T13:41:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=97656#p97656</id>
		</entry>
</feed>
