Bibliotecas: Serialização e desserialização de JSON (MQL nativo)

 

Serialização e desserialização de JSON (MQL nativo):

Serialização e desserialização do protocolo JSON. O código é transferido de uma biblioteca С++ o com alta velocidade.

Exemplo prático: autorização num site e analisar a resposta

CJAVal jv;
jv["login"]="Login"; // login
jv["password"]="Pass"; // senha

//--- serializar para string  {"login":"Login","password":"Pass"}
char data[]; 
ArrayResize(data, StringToCharArray(jv.Serialize(), data, 0, WHOLE_ARRAY)-1);

//--- enviar dados
char res_data[];
string res_headers=NULL;
int r=WebRequest("POST", "http://my.site.com/Authorize", "Content-Type: text/plain\r\n", 5000, data, res_data, res_headers);

//--- assumir a resposta {"accessToken":"ABRAKADABRA","session_id":124521}
//--- obter o AccessToken
jv.Deserialize(res_data);
string AccessToken=jv["accessToken"].ToStr();

Autor: o_O

 

A biblioteca funciona em MQL4 e MQL5

A gratidão é aceita na forma de exemplos de seu trabalho prático com recursos da Web da MQL. ;)

 

Funciona no MT4. No MT5, o erro Stack overflow é exibido. Não há informações sobre o local do estouro. E o depurador simplesmente trava.

O erro aparece em um exemplo elementar:

#include <jason.mqh>

void OnStart()
{
   CJAVal json;
   json["item1"] = "value1";
   json["item2"] = "value2";
}

Como se viu, o script trava na linha 90, aumentando o tamanho de 'm_e' de 1 para 2x:

ArrayResize(m_e,c+1);


P.S. MT5 build 1210

 
a.p:

Funciona no MT4. No MT5, o erro Stack overflow é exibido. Não há informações sobre o local do estouro. E o depurador simplesmente trava.

O erro aparece em um exemplo elementar:

Como se viu, o script trava na linha 90, aumentando o tamanho de 'm_e' de 1 para 2x:


P.S. MT5 build 1210

Obrigado pela mensagem, o erro foi corrigido. A correção será incluída na próxima compilação do terminal.
 

Obrigado pela biblioteca, mas há alguns problemas.

Não consigo descobrir como posso colar uma matriz usando a biblioteca.

Por exemplo, há

string a[] = {"1", "2", "3"};
int b[] = {1, 2, 3};
double c[] = {1.1, 2.9, 3.03};

Os problemas surgem no nível de declaração de uma variável do tipo CJAVal. Usar CJAVal primer(jtARRAY, a); não ajuda.

O exemplo de matriz que você mostrou no exemplo não funciona para mim - e se eu tiver 10 valores na matriz? Tenho que criar novas 10 variáveis do tipo CJAVal????

Você poderia complementar ou expandir o arquivo de exemplo ?????

p.s. Estou trabalhando com o formato json pela primeira vez. Estudei seu programa de arquivo de exemplo.

 

Uau, isso é trabalho duro! E para quê? Para extrair algumas variáveis de uma pequena linha.

Por que o código está formatado dessa forma? Para que ninguém tente dar uma olhada nele? Afinal, trata-se de uma base de código.

 
Dmitry Fedoseev:

Uau, isso é trabalho duro! E para quê? Para extrair algumas variáveis de uma pequena linha.

Por que o código está formatado dessa forma? Para que ninguém tente dar uma olhada nele? Afinal, é uma base de código.

Estou interessado na ideia de gravar rapidamente qualquer dado em um arquivo e extraí-lo rapidamente. É uma pena que a liba não formate a legibilidade para o olho humano :( Estou inclinado ao fato de que provavelmente eu mesmo escreverei um programa desse tipo para minhas tarefas.

O código foi simplificado o máximo possível - minimização!

 
Виктор Василюк:

Estou interessado na ideia de gravar rapidamente quaisquer dados em um arquivo e extraí-los rapidamente. É uma pena que a biblioteca não formate a legibilidade para o olho humano :( Estou inclinado ao fato de que provavelmente escreverei um programa desse tipo para minhas próprias tarefas.

O código foi simplificado o máximo possível - minimização!

Ele não é bom para essa tarefa, não é como a serialização em PHP ou C#.

Há uma colher de sopa de tarte aqui:

   virtual CJAVal *FindKey(string akey) { 
      for(int i=0; i<ArraySize(m_e); i++) 
      if(m_e[i].m_key==akey) 
      return GetPointer(m_e[i]); 
      return NULL; 
   }
A chave é pesquisada por força bruta simples. Não é possível trabalhar rapidamente com dados grandes.
 
Dmitry Fedoseev:

Não é bom para essa tarefa, não é como a serialização em PHP ou C#.

Há uma colher de alcatrão aqui:

A chave é encontrada por uma simples pesquisa de força bruta. Você não conseguirá trabalhar rapidamente com dados grandes.
Obrigado. Encontrei outra biblioteca. Parece estar funcionando bem.
 
Виктор Василюк:
Obrigado. Encontrei outra biblioteca. Parece estar funcionando bem.
Lá, se não me engano, o número de elementos de hash é limitado.
 
Dmitry Fedoseev:
Há um número limitado de elementos de hash, se não me engano.
O que faremos agora? Existe alguma outra maneira de resolver isso?