Bibliotecas: Serialização e desserialização de JSON (MQL nativo) - página 12

 
danielsokolowsk:

Alguém ou o autor poderia responder se isso é compatível com JSON aninhado? Ou seja, uma instância CJAVal contém as chaves '2' e '3', que são outra instância CJAVal. O código parece ser executado, mas quando serializado as chaves ficam em branco.

Por exemplo, estou recebendo:


Mas deveria estar recebendo

https://www.mql5.com/ru/forum/63015

Alguns exemplos

   string a[] = {"1", "2", "3"};
   int b[] = {1, 2, 3};
   
   CJAVal js;
   js["a"].Add(a[0]);
   js["a"].Add(a[1]);
   js["a"].Add(a[2]);
        
   js["b"].Add(b[0]);
   js["b"].Add(b[1]);
   js["b"].Add(b[2]);
   
   js["c"][0]=1.1;
   js["c"][1]=2.9;
   js["c"][2]=3.03;
   
   string t=js.Serialize();
   Print(t);   // {"a":["1","2","3"],"b":[1,2,3],"c":[1.10000000,2.90000000,3.03000000]} 
   
   
   js.Clear();
   js.Deserialize(t); 
   Print(js["c"][2].ToStr()); // 3.03000000

matriz de matrizes

JAval j1; j1.Add(1);

JAval j2; j2.Add(2); j2.Add(3);

JAval js;

js["a"].Add(j1);
js["a"].Add(j2);

// { a: [ [1], [2,3] ]; }
Библиотеки: JSON Serialization and Deserialization (native MQL)
Библиотеки: JSON Serialization and Deserialization (native MQL)
  • 2015.08.18
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: JSON Serialization and Deserialization (native MQL)
 
Ótimo design, obrigado, mano! Funciona como um relógio, usei-o em meu robô.
 
Konstantin Efremov:
Ótimo design, obrigado, mano! Funciona como um relógio, usei-o em meu robô.

Há alguns erros na Bíblia. Em anexo está a versão corrigida, graças ao autor, que provavelmente não se importará.

Arquivos anexados:
json.mqh  44 kb
 

Olá,


Estou tentando usar essa biblioteca para ler um arquivo json.


Você poderia fornecer um exemplo em um caso como esse?


Minhas primeiras linhas são :

   string s[];
   int cpt=0;
   
   int handle=FileOpen("json_sample.txt",FILE_READ|FILE_TXT|FILE_ANSI);
   while(!FileIsEnding(handle)) {ArrayResize(s,ArraySize(s)+1); s[cpt++]=FileReadString(handle);}
   FileClose(handle);


O que devo fazer para armazenar alguns valores do arquivo json em minhas variáveis?


Obrigado pela ajuda!

Erwann.

 

Depois de algumas pesquisas, resolvi meu problema :)


Não é necessário usar a tabela de strings [] porque a limitação da string é de 256 bytes.


Na verdade, não há limitação de comprimento da string (apenas para a inicialização entre aspas "").

Portanto, você só precisa usar este código:

   CJAVal srce;
   
   string s;
   int cpt=0;
   
   int handle=FileOpen("json_sample.txt",FILE_READ|FILE_TXT|FILE_ANSI);
   while(!FileIsEnding(handle)) StringAdd(s,FileReadString(handle));
   FileClose(handle);
   
   srce.Deserialize(s);


a variável s string pode ter um comprimento superior a 256 caracteres :)


Tchau,

Erwann.

 
danielsokolowsk:

Alguém ou o autor poderia responder se isso é compatível com JSON aninhado? Ou seja, uma instância CJAVal contém as chaves '2' e '3', que são outra instância CJAVal. O código parece ser executado, mas quando serializado as chaves ficam em branco.

Por exemplo, estou recebendo:


Mas deveria estar recebendo

Daniel, também tive o mesmo problema com chaves vazias ao usar objetos JSON aninhados (não matrizes). Resolvi o problema usando a função Set(). Exemplo:

CJAVal msg, content;
msg["messageName"] = "TickData";
content["instrument"] = Symbol();
content["timeFrame"] = (int) Period();
content["time"] = (int) TimeCurrent();
content["open"] = iOpen(Symbol(), Period(), 0);
msg["content"].Set(content);
Print("Sending JSON to server: ", msg.Serialize());

 
Andrey Dik:

há alguns erros na Bíblia. em anexo está a versão corrigida, graças ao autor e provavelmente não se importará.

Obrigado!

 

Como faço para remover um elemento de uma árvore JSON. Há um método para definir e adicionar, mas não para excluir

Desde já, obrigado

[Excluído]  

Muito bom, adicionei suporte aos tipos ulong e datetime.

[Excluído]  
Ting Yu:

O resultado do WebRequest é uma matriz e eu o invoco da seguinte forma

jv.Deserialize( result);


como posso iterá-lo?

se o resultado gostar de
[{"a":1},{"a":2}]

'

você pode usar jv[0]["a"].ToInt() para obter 1, jv[1]["a"].ToInt() para obter 2