Leitura do retorno do Json - Webrequest

 

Pessoal, preciso de uma ajuda.


Já pesquisei quase todos os links e referencias, tentei varias opções porém não estou conseguindo ler o retorno do JSON da minha chamada Webrequest.


A chamada está retornando o seguinte: 

dados :{"message":[{"MOEDA":"EURUSD","TIMEFRAME":15,"SWAPATIVO":0,"SWAPMOEDA":1,"ALERTA":"True","EA_MAGICO":201900059298,"IDENTIFICADOR_ROB":"EURUSD-15-2.15","ESPERA":500,"META":1000,"PARA":1000,"VALORCORRETAGEM":0,"LOTES":"0.01","AUMENTO1":"True","AUMENTO2":"True","AUMENTO3":"True","AUMENTO4":"False","AUMENTO5":"False","LOTES1":"0.03","LOTES2":"0.05","LOTES3":"0.08","LOTES4":0,"LOTES5":0,"controlaSLTPnaordem ":"True","aumentonapedra ":"True","operasoembarra ":"True","naooperamaxmin ":"false","distanciamaxmin ":15,"retiraaumento ":"false","valoresponto ":"true","filtraspread ":"true","spreadmaximo ":10,"afastamento_pontos ":108,"TPR_pontos ":50,"TPRaumento_pontos ":50,"SLR_pontos ":500,"distanciaaumento1_pontos ":100,"distanciaaumento2_pontos ":100,"distanciaaumento3_pontos ":75,"distanciaaumento4_pontos ":0,"distanciaaumento5_pontos ":0,"afastamento_per ":0,"TPR_per ":0,"TPRaumento_per ":0,"SLR_per ":0,"distanciaaumento1_per ":0,"distanciaaumento2_per ":0,"distanciaaumento3_per ":0,"distanciaaumento4_per ":0,"distanciaaumento5_per ":0,"horainicio ":2,"minutoinicio ":0,"horalimite ":20,"minutolimite ":30,"horaencerra ":23,"minutoencerra ":40,"janela1 ":"false","horainiciojanela1 ":0,"minutoiniciojanela1 ":0,"horafimjanela1 ":0,"minutofimjanela1 ":0,"janela2 ":"false","horainiciojanela2 ":0,"minutoiniciojanela2 ":0,"horafimjanela2 ":0,"minutofimjanela2 ":0,"media11 ":7,"media22":15,"validanoticia ":"true","fuso ":0,"toleranciaindicador1 ":30,"toleranciaindicador2 ":45,"fechaoperacaonoticia ":"false","toleranciaindicador11 ":5,"swapmoeda1 ":3,"swapmoeda2":5,"swapmoeda3":10,"swapmoeda4":0,"swapimportancia ":3,"habilitaADX ":"false","ADX ":7,"VADX1 ":100,"DI_PLUS ":"1.5","DI_MINUS ":"1.5","habilitaATR ":"false","ATR ":7,"ATRMINVENDA ":0,"ATRMAXCOMPRA ":0,"maximocontratos ":"0.34","sotexto ":"true","filtro1":0,"filtro2":0,"filtro3":0,"filtro4":0,"filtro5":0,"filtro6":0,"filtro7":0,"filtro8":0,"filtro9":0,"filtro10":0}]}



o código está abaixo, porém quando dou o print da variável que quero pegar (avaixo MOEDA), ele retorna em branco. para qualquer campo do Json vem assim. alguem tem uma luz?

os includes são:

#include <JAson.mqh>;

#include <json.mqh>;

#include <hash.mqh>;

#include <Arrays\ArrayObj.mqh>;


 res=WebRequest("POST",uri,NULL,NULL, 5000, post, ArraySize(post),result, result_header);

 ulong dados;

  dados = CharArrayToString(result,0,-1);

   if(res==-1)

     {

      Print("Error code =",GetLastError());

         MessageBox("Add address '"+uri+"' in Expert Advisors tab of the Options window","Error",MB_ICONINFORMATION);

     }

   else

     {

      //--- successful

       if (res==200)

       {

      ulong strRes="";

      strRes=CharArrayToString(result,CP_ACP);

      CJAVal dataM;

      dataM.Deserialize(strRes);

      string stat=dataM["MOEDA"].ToStr();

      Print(stat);

     }        

  

      Print("REST client's POST: ",signal);

      

      Print("Server response: ",CharArrayToString(result,0,-1));

      ;

     } 





 
Gilberto Beltrao Dupita:

Pessoal, preciso de uma ajuda.


Já pesquisei quase todos os links e referencias, tentei varias opções porém não estou conseguindo ler o retorno do JSON da minha chamada Webrequest.


A chamada está retornando o seguinte: 

dados :{"message":[{"MOEDA":"EURUSD","TIMEFRAME":15,"SWAPATIVO":0,"SWAPMOEDA":1,"ALERTA":"True","EA_MAGICO":201900059298,"IDENTIFICADOR_ROB":"EURUSD-15-2.15","ESPERA":500,"META":1000,"PARA":1000,"VALORCORRETAGEM":0,"LOTES":"0.01","AUMENTO1":"True","AUMENTO2":"True","AUMENTO3":"True","AUMENTO4":"False","AUMENTO5":"False","LOTES1":"0.03","LOTES2":"0.05","LOTES3":"0.08","LOTES4":0,"LOTES5":0,"controlaSLTPnaordem ":"True","aumentonapedra ":"True","operasoembarra ":"True","naooperamaxmin ":"false","distanciamaxmin ":15,"retiraaumento ":"false","valoresponto ":"true","filtraspread ":"true","spreadmaximo ":10,"afastamento_pontos ":108,"TPR_pontos ":50,"TPRaumento_pontos ":50,"SLR_pontos ":500,"distanciaaumento1_pontos ":100,"distanciaaumento2_pontos ":100,"distanciaaumento3_pontos ":75,"distanciaaumento4_pontos ":0,"distanciaaumento5_pontos ":0,"afastamento_per ":0,"TPR_per ":0,"TPRaumento_per ":0,"SLR_per ":0,"distanciaaumento1_per ":0,"distanciaaumento2_per ":0,"distanciaaumento3_per ":0,"distanciaaumento4_per ":0,"distanciaaumento5_per ":0,"horainicio ":2,"minutoinicio ":0,"horalimite ":20,"minutolimite ":30,"horaencerra ":23,"minutoencerra ":40,"janela1 ":"false","horainiciojanela1 ":0,"minutoiniciojanela1 ":0,"horafimjanela1 ":0,"minutofimjanela1 ":0,"janela2 ":"false","horainiciojanela2 ":0,"minutoiniciojanela2 ":0,"horafimjanela2 ":0,"minutofimjanela2 ":0,"media11 ":7,"media22":15,"validanoticia ":"true","fuso ":0,"toleranciaindicador1 ":30,"toleranciaindicador2 ":45,"fechaoperacaonoticia ":"false","toleranciaindicador11 ":5,"swapmoeda1 ":3,"swapmoeda2":5,"swapmoeda3":10,"swapmoeda4":0,"swapimportancia ":3,"habilitaADX ":"false","ADX ":7,"VADX1 ":100,"DI_PLUS ":"1.5","DI_MINUS ":"1.5","habilitaATR ":"false","ATR ":7,"ATRMINVENDA ":0,"ATRMAXCOMPRA ":0,"maximocontratos ":"0.34","sotexto ":"true","filtro1":0,"filtro2":0,"filtro3":0,"filtro4":0,"filtro5":0,"filtro6":0,"filtro7":0,"filtro8":0,"filtro9":0,"filtro10":0}]}



o código está abaixo, porém quando dou o print da variável que quero pegar (avaixo MOEDA), ele retorna em branco. para qualquer campo do Json vem assim. alguem tem uma luz?

os includes são:

#include <JAson.mqh>;

#include <json.mqh>;

#include <hash.mqh>;

#include <Arrays\ArrayObj.mqh>;


 res=WebRequest("POST",uri,NULL,NULL, 5000, post, ArraySize(post),result, result_header);

 ulong dados;

  dados = CharArrayToString(result,0,-1);

   if(res==-1)

     {

      Print("Error code =",GetLastError());

         MessageBox("Add address '"+uri+"' in Expert Advisors tab of the Options window","Error",MB_ICONINFORMATION);

     }

   else

     {

      //--- successful

       if (res==200)

       {

      ulong strRes="";

      strRes=CharArrayToString(result,CP_ACP);

      CJAVal dataM;

      dataM.Deserialize(strRes);

      string stat=dataM["MOEDA"].ToStr();

      Print(stat);

     }        

  

      Print("REST client's POST: ",signal);

      

      Print("Server response: ",CharArrayToString(result,0,-1));

      ;

     } 

Desculpe a franqueza mas só quem usou ou usa essas LIBs irá poder te ajudar. Inclusive não sei porque você esta'usando 2 LIBs de JSON ao mesmo tempo, o que aumenta ainda mais a dificuldade de tentar interpretar qualquer coisa.


Sugiro você entrar em contato com o autor das LIBs...


Independente do seu código postado, eu nem me vou dar ao trabalho de analisar as 3 LIBs que vc está usando para te dar a solução... Aí entra uma extensiva Lição de Casa que você mesmo deve fazer...

Interpretar JSON é mil vezes mais produtivo, seguro e fácil do que XML... Só que vc precisa saber o que você está fazendo...

;)

 

Utilizo WebRequest e funciona.

Ex:

#include <JAson.mqh>

CJAVal content;

// resultServer = Resposta do servidor em JSON

WebRequest(method, url, headers, timeout, data, resultServer, resultServerHeaders);

content.Deserialize(resultServer);

Print(content["message"].ToStr());

 
testa o seu json via Postman ou insomnia, pelo menos vc testa o que vai enviar e receber, depois é só jogar no mt5
 
Ola! Acho que para pegar um json vc deve usar o methodo GET em vez de POST!
 
David Vieira:
Ola! Acho que para pegar um json vc deve usar o methodo GET em vez de POST!
Depende da API, no padrão REST também é possível retornar um body em GET
 

Analisando melhor o problema... Sim da pra pegar tanto com GET como pelo POST. Ao meu ver o você deve pegar primeiro o json da key "message" depois de moeda, seja descer mais um nivel do array.
Exemplo:
string stat = dataM["Message"][0] .ToStr() ;

 
deserializar mais um nivel também
Razão: