Jump to content
Sign in to follow this  
Luigi

json (instável)

Recommended Posts

Eu sei... eu sei... pelo menos no fórum oficial já existe umas 4 ou mais versões de JSON para AutoIt.

Todas são boas, funcionam, mas... as vezes falta um coisinha aqui ou ali...

Uma das coisinhas que me incomoda é a falta de conversão dos caracteres acentuados, ou pelo menos, eu não achei essa parte nas versões que trabalhei (talvez esteja ficando cego).

Outra não trabalha com Scripting.Dictionary (o que tenho usado muito e acho fantástico).

 

  • Precisa refatorar;
  • Ela apenas converte de AutoIt para JSON;
  • Ainda não possui um 'decode' ou caminho reverso;
  • É totalmente recursiva;
  • Trabalha apenas com array: array de dimensão($aArray[xx]) 1 e bidimensional ($aArray[xx][yy]);
  • Não trabalha com $aArray[xx][yy][zz] ou maior;
  • Trabalha com Scripting.Dictionary;

 

Estou compartilhando para que os colegas utilizem e reportem bugs.

 

Nos meus testes, toda a string gerada e utilizada no PHP com json_decode funcionou bem!

 

Salute!

#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.10.2
	Script instável
	versão 1
	Author: Luigi
	file name: json_v1.au3

	Script Function:
	code($input)
	$input pode ser qualquer tipo de dado, Scripting.Dictionary, array, int, string, etcc
	converte $input em json string para ser utilizado pelo PHP

#ce ----------------------------------------------------------------------------

#include <Array.au3>
Global $a_JSON_ENCODE[132][2] = [[34, '\"'],[47, '\/'],[92, '\\\'],[128, ''],[129, ''],[130, ''],[131, ''],[132, ''],[133, ''],[134, ''],[135, ''], _
		[136, ''],[137, ''],[138, '\u008a'],[139, '\u008b'],[140, '\u008c'],[141, '\u008d'],[142, '\u008e'],[143, '\u008f'],[144, ''],[145, ''],[146, ''], _
		[147, ''],[148, ''],[149, ''],[150, ''],[151, ''],[152, ''],[153, ''],[154, '\u009a'],[155, '\u009b'],[156, '\u009c'],[157, '\u009d'], _
		[158, '\u009e'],[159, '\u009f'],[160, '\u00e1'],[161, '\u00a1'],[162, '\u00a2'],[163, '\u00a3'],[164, '\u00a4'],[165, '\u00a5'],[166, '\u00a6'],[167, '\u00a7'],[168, '\u00a8'], _
		[169, '\u00a9'],[170, '\u00aa'],[171, '\u00ab'],[172, '\u00ac'],[173, '\u00ad'],[174, '\u00ae'],[175, '\u00af'],[176, '\u00b0'],[177, '\u00b1'],[178, '\u00b2'],[179, '\u00b3'], _
		[180, '\u00b4'],[181, '\u00b5'],[182, '\u00b6'],[183, '\u00b7'],[184, '\u00b8'],[185, '\u00b9'],[186, '\u00ba'],[187, '\u00bb'],[188, '\u00bc'],[189, '\u00bd'],[190, '\u00be'], _
		[191, '\u00bf'],[192, '\u00c0'],[193, '\u00c1'],[194, '\u00c2'],[195, '\u00c3'],[196, '\u00c4'],[197, '\u00c5'],[198, '\u00c6'],[199, '\u00c7'],[200, '\u00c8'],[201, '\u00c9'], _
		[202, '\u00ca'],[203, '\u00cb'],[204, '\u00cc'],[205, '\u00cd'],[206, '\u00ce'],[207, '\u00cf'],[208, '\u00d0'],[209, '\u00d1'],[210, '\u00d2'],[211, '\u00cb'],[212, '\u00d4'], _
		[213, '\u00d5'],[214, '\u00d6'],[215, '\u00d7'],[216, '\u00d8'],[217, '\u00d9'],[218, '\u00da'],[219, '\u00db'],[220, '\u00dc'],[221, '\u00dd'],[222, '\u00de'],[223, '\u00df'], _
		[224, '\u00d3'],[225, '\u00e1'],[226, '\u00e2'],[227, '\u00e3'],[228, '\u00e4'],[229, '\u00e5'],[230, '\u00e6'],[231, '\u00e7'],[232, '\u00e8'],[233, '\u00e9'],[234, '\u00ea'], _
		[235, '\u00eb'],[236, '\u00ec'],[237, '\u00ed'],[238, '\u00ee'],[239, '\u00ef'],[240, '\u00f0'],[241, '\u00f1'],[242, '\u00f2'],[243, '\u00f3'],[244, '\u00f4'],[245, '\u00f5'], _
		[246, '\u00f6'],[247, '\u00f7'],[248, '\u00f8'],[249, '\u00f9'],[250, '\u00fa'],[251, '\u00fb'],[252, '\u00fc'],[253, '\u00fd'],[254, '\u00fe'],[255, '\u00ff'],[256, 'Ā']]


Global $oo = ObjCreate('Scripting.Dictionary')
$oo.Add('chave', -1.2)
$oo.Add('cidade', 'Curitiba')

Global $aTeste[3][3] = [[1, 'Argüição', 3],[4, 5, 6],[7, $oo, 9]]

Global $oo[3] = [1, 2, 3]
;~ _ArrayDisplay($aTeste)

Local $json = code($aTeste)
ConsoleWrite('==========' & @LF & $json & @LF & '==========' & @LF)



Func code($input)
	Local $aTemp[1]
	If IsObj($input) Then
		Local $oKeys = $input.Keys
		For $each In $oKeys
			_ArrayAdd($aTemp, '{' & code($each) & ':' & code($input.Item($each)) & '}')
		Next
		Return _ArrayToString($aTemp, ',', 1)
	Else
		If IsArray($input) Then
			Switch UBound($input, 0)
				Case 1
					For $ii = 0 To UBound($input) - 1
						_ArrayAdd($aTemp, code($input[$ii]))
					Next
					Return '[' & _ArrayToString($aTemp, ',', 1) & ']'
				Case 2
					For $ii = 0 To UBound($input, 1) - 1
						Local $aTemp2[1]
						For $jj = 0 To UBound($input, 2) - 1
							_ArrayAdd($aTemp2, code($input[$ii][$jj]))
						Next
						_ArrayAdd($aTemp, '[' & _ArrayToString($aTemp2, ',', 1) & ']')
					Next
					Return '[' & _ArrayToString($aTemp, ',', 1) & ']'
				Case 3
			EndSwitch
		Else
;~ 			ConsoleWrite('VarGetType[' & VarGetType($input) & ']' & @LF)
			Switch VarGetType($input)
				Case 'String'
					Return '"' & _code($input) & '"'
				Case 'Int32', 'Double'
					Return $input
				Case Else
					ConsoleWrite('VarGetType desconhecido [' & VarGetType($input) & ']' & @LF)
			EndSwitch
		EndIf
	EndIf
EndFunc   ;==>code

Func _code($input)
	Local $new, $iSearch
	$input = StringSplit($input, '', 2)
	For $each In $input
		$iSearch = _ArraySearch($a_JSON_ENCODE, AscW($each))
		If @error Then
			$new &= $each
		Else
			$new &= $a_JSON_ENCODE[$iSearch][1]
		EndIf
	Next
	Return $new
EndFunc   ;==>_code
Edited by Luigi
  • Like 1

Share this post


Link to post
Share on other sites

Yes! Eu posso (vou tentar)!

 

No código abaixo, temos um array dentro de outro array.

O primeiro array, contém outros arrays.

Os arrays de segundo nível, são indexados não por números, mas por chaves.

<?php
    // PHP
    $arr = array(
        array('cidade' => 'Curitiba'),
        array('estação' => 'Inverno'),
        array('filme' => 'Aliens - O resgate'),
        array('atriz' => 'Sandra Bullock')
    );
    echo json_encode($arr);
?>

A função json_encode($arr) retorna este array codificado em JSON, com o seguinte conteúdo:

[{"cidade":"Curitiba"},{"esta\u00e7\u00e3o":"Inverno"},{"filme":"Aliens - O resgate"},{"atriz":"Sandra Bullock"}]

O formato JSON é fácil de ser entendido, e uma das maiores vantagens (entre muitas) é o transporte de dados entre sistemas e/ou linguagens diferentes. Veja JSON.

 

No AutoIt não há um array indexado como no PHP, pelo menos, não com esse nome...

Uso ObjCreate('Scripting.Dictionary') no AutoIt como se fosse um array indexado do PHP, pelo menos pra mim, parece a mesma coisa, logicamente, a sintaxe é diferente.

Estou amadurecendo meus conhecimentos entre o transporte de dados PHP <=> AutoIt, por isso essa função.

 

No AutoIt você pode fazer o mesmo array da seguinte forma:

#include <json_v1.au3>

Global $oo = ObjCreate('Scripting.Dictionary')

$oo.Add('cidade', 'Curitiba')
$oo.Add('estação', 'Inverno')
$oo.Add('filme', 'Aliens - O resgate')
$oo.Add('atriz', 'Sandra Bullock')

Global $arr[1] = [$oo]

Global $json = code($arr)
ConsoleWrite($json & @LF)

A saída do ConsoleWrite é a seguinte:

[{"cidade":"Curitiba"},{"esta\u00e7\u00e3o":"Inverno"},{"filme":"Aliens - O resgate"},{"atriz":"Sandra Bullock"}]

Agora percebo um 'bug', os acentos não foram codificados para UNICODE... Falta também algumas chaves {}.

Esse script tenho utilizado para enviar informações do AutoIt para um script em PHP, ele trata as informações e retorna em JSON, num formato mais simples, não tão complexo (cheio de arrays e objeto).

 

Minha maior dificuldade até o momento: converter um carácter para UNICODE utilizando AutoIt da forma correta.

Como por exemplo, ç para \u00e7.

Edited by Luigi

Share this post


Link to post
Share on other sites

@luigi não sei não, faz uma cara que não faço nada em php, mais se não me engano essa conversão não é necessária já que se pode definir o header da resposta no php

 
<?php
    // PHP
header('Content-Type: application/json');
        echo 'alguma coisa no formato json';
?>
E ainda você pode usar o motor javascript do internet explorer para o encode e decode...

 

É claro que tu que está trabalhando com isso no momento está muito mais por dentro que eu, só quis compartilhar porque já fiz isso tempos atrás e não tive problemas com acentos então acho que tem uma maneira mais fácil, mas enfim seu código está ótimo e faz o procedimento corretamente e obrigado por compartilhar.

Edited by joelson0007

Share this post


Link to post
Share on other sites

Mas olha só, que coisa interessante...

Isso me passou desapercebido, do que você falou sobre o motor javascript do internet explorer, isso é interessante!

É bom conversar! ^^

 

@joelson, quanto ao header, você está certo, eu também uso, mas talvez eu me expressei mal... Eu leio (AutoIt) o conteúdo do PHP sem dificuldades, o problema, por enquanto é desencapsular as informações.

Edited by Luigi

Share this post


Link to post
Share on other sites

Hum entendi, então veja que temos acesso ao motor javascript do internet explorer com a COM ObjCreate("InternetExplorer.Application.1") , e após isso temos acesso a funçao JSON.parse -> http://msdn.microsoft.com/pt-br/library/cc836466(v=vs.94).aspx do javascript, acho que se nós colocar o internet explorer para desencapsular as informações. pode ser um caminho.

 

até mais.

  • Like 1

Share this post


Link to post
Share on other sites

Luigi desculpe por ressuscitar o tópico , mas só queira deixar registrado aqui que trabalhar com Json proporcionou uma flexibilidade imensa por esses dias...

 

Trabalhar com tudo como Objeto é bem mais prático. ;)

 

Fiz um pequeno script para converter tudo que tinha para Json e ai depois vi que tinha umas UDFS no fórum gringo , mas ai já tinha feito... :lol: e foi coisa simples...

 

Nunca é tarde para evoluir. :up:

 

Abraços e DEUS abençoe.

Share this post


Link to post
Share on other sites

Obrigado pelo retorno Fabio, mas gostaria de sugerir que voce usasse o JSMN:

https://github.com/chechelaky/AutoIt/blob/master/JSMN.au3 e o https://github.com/chechelaky/AutoIt/blob/master/object_dump.au3 para visualizar os objetos.

 

Eu gastei um bom tempo e energia tentando desenvolver uma udf para json, mas o JSMN, ja estava madura e bem adiantada.

 

Mas ela einda tem uma limitacao bem seria, é a comprimento de longas sequencias de string.

Se voce estiver trabalhando com sequencias basicas, nao teras problemas, mas eu preciso trabalhar com sequencias longas, nesse ponto, acho que nao e uma limitacao do JSMN, mas sim do autoit.

 

Se precisar de algo mais, so pedir.

  • Like 1

Share this post


Link to post
Share on other sites

Obrigado pelo retorno Fabio, mas gostaria de sugerir que voce usasse o JSMN:

https://github.com/chechelaky/AutoIt/blob/master/JSMN.au3 e o https://github.com/chechelaky/AutoIt/blob/master/object_dump.au3 para visualizar os objetos.

 

Eu gastei um bom tempo e energia tentando desenvolver uma udf para json, mas o JSMN, ja estava madura e bem adiantada.

 

Mas ela einda tem uma limitacao bem seria, é a comprimento de longas sequencias de string.

Se voce estiver trabalhando com sequencias basicas, nao teras problemas, mas eu preciso trabalhar com sequencias longas, nesse ponto, acho que nao e uma limitacao do JSMN, mas sim do autoit.

 

Se precisar de algo mais, so pedir.

 

 

Obrigado Luigi , vou dar um BOAAAAAAAAA olhada e com certeza vai servir sim.

 

Por enquanto vou usar para pequenas adaptações mesmo , mas as vezes a coisa cresce e as sequências de strings vão aumentando kkkkk .

 

Obrigado e DEUS abençoe.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×