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

 

fixo

1.13

Arquivos anexados:
JAson.mqh  31 kb
 
o_o:
Sim, eu provavelmente não entendi qual era o seu problema, pois as linhas que você mostrou que conseguiu obter tudo.
{
  "server_time": 1519120845,
  "pairs": {
    "btc_usd": {
      "decimal_places": 3,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_rur": {
      ...
    },
    "btc_eur": {
      ...

A bolsa fornece esta resposta.... (e o número de pares pode ser diferente... por exemplo, se a bolsa desativar ou adicionar alguns pares).

Preciso, de alguma forma, obter todos os nomes dos pares na resposta (btc_usd, btc_rur, btc_eur etc.) em um loop ou por meio de uma chamada recursiva, não importa.... Não consigo descobrir como obter o primeiro e o próximo nome de um par... Não consigo descobrir como obter o primeiro e o próximo nome de um par....

 
Delta.800:

a bolsa dá esta resposta.... (e o número de pares pode ser diferente.... por exemplo, se a bolsa desativar ou adicionar algum par).

Preciso, de alguma forma, obter todos os nomes dos pares na resposta (btc_usd, btc_rur, btc_eur etc.) em um loop ou por meio de uma chamada recursiva, não importa.... Não consigo descobrir como obter o primeiro e o próximo nome de um par... Não consigo descobrir como obter o primeiro e o próximo nome de um par... Não consigo descobrir....

Corte a cadeia de caracteres no início

{
  "server_time": 1519120845,
  "pairs": 

Em seguida, exclua o } no final da string

Em seguida, alimente a string com o analisador.

Preencha sua estrutura com os dados do analisador. E, em seguida, faça o que quiser com sua estrutura - nomes de pares, etc.

 
Andrey Dik:

Corte a linha no início

Em seguida, exclua no final da linha }

Em seguida, alimentar a string no analisador.

Preencha sua estrutura com os dados do analisador. E, em seguida, faça o que quiser com sua estrutura - nomes de pares, etc.

"Em seguida, alimente a string no analisador." - está certo? dataM.Deserialize(ttt);

"Preencha sua estrutura com os dados do analisador". - como fazer isso? por favor, me dê uma linha..... (não é necessário descrever a estrutura))

ss Eu quis dizer uma estrutura simples, não uma estrutura orientada a objetos, como

struct bpInfo
{
public:
        ulong server_time;
        bpPairInfo pairs[];
        
        bool FromJson(CJAVal& ja)
        {
                server_time=(uint)ja["server_time"].ToInt();
                CJAVal* jp=ja["pairs"];
                int n=ArrayResize(pairs, ArraySize(jp.m_e));
                for (int i=0; i<n; ++i) pairs[i].FromJson(jp.m_e[i]);
                return true;
        }
};
Acho que há algo semelhante aqui, mas não consigo entender. (Não sou bom em OOP, ainda...).
 
o_o:

fixo

1.13

Experimente este exemplo:

#include "JAson.mqh"

//+------------------------------------------------------------------+
void OnStart ()
{
  string in, out;
  CJAVal js (NULL, jtUNDEF);
  bool b;

  //---
  in =  "{\"фирма1\":{\"модельный_ряд1\":[[0.1,1.3],[0.2,1.5],[0.3,2.0]],\"модельный_ряд2\":[[0.1,2.3],[0.2,2.5],[0.3,3.0]]},\"фирма2\":{\"модельный_ряд1\":[[0.2,3.8],[0.3,4.0],[0.4,4.5]],\"модельный_ряд2\":[[0.2,4.8],[0.3,5.0],[0.4,6.5]]}}}";
  Print(in);
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  for (int i = 0; i < ArraySize (js.m_e); i++)
  {
    Print("---");
    Print(js.m_e[i].m_key);
    
    for (int i1 = 0; i1 < ArraySize (js.m_e [i].m_e); i1++)
    {
      Print("   : ", js.m_e[i].m_e[i1].m_key);
      
      for (int i2 = 0; i2 < ArraySize (js.m_e [i].m_e [i1]. m_e); i2++)
      {
        Print("      : ", js.m_e[i].m_e[i1].m_e[i2].m_key, " :", js.m_e[i].m_e[i1].m_e[i2].ToDbl());
      }
    }
  }
}
//+------------------------------------------------------------------+
 
Delta.800:

"Em seguida, alimente a cadeia de caracteres para o analisador." - está certo? dataM.Deserialize(ttt);

"Preencha sua estrutura com os dados do analisador." - como fazer isso? por favor, me dê uma linha..... (não é necessário descrever a estrutura))

Veja meu exemplo sobre empresas e faixa de modelos - ele mostra como obter dados do analisador.....


o_o:

corrigido

1.13

No entanto..... desmonta e coleta o tempo perfeitamente, mas não consigo obter dados..... talvez não haja dables, ints, etc.? - deixe a string como está, na forma de string, e decida como lidar com essa string do lado de fora.

 
Andrey Dik:

No entanto..... Desmonta e monta o termo é ótimo, mas não consigo entender os dados.... Talvez não precisemos de dables, ints, etc.? - deixe a cadeia de caracteres como ela está, na forma de cadeia de caracteres, e depois decida como lidar com essa cadeia de caracteres do lado de fora.

Você tem uma matriz em uma matriz. Isso significa que você precisa adicionar outro nível de loop i3.

модельный_ряд1 :[ [ 0.1,1.3], [ 0.2,1.5], [ 0.3,2.0] ]
#include <JAson.mqh>

//+------------------------------------------------------------------+
void OnStart ()
{
  string in, out;
  CJAVal js (NULL, jtUNDEF);
  bool b;

  //---
  in =  "{\"фирма1\":{\"модельный_ряд1\":[[0.1,1.3],[0.2,1.5],[0.3,2.0]],\"модельный_ряд2\":[[0.1,2.3],[0.2,2.5],[0.3,3.0]]},\"фирма2\":{\"модельный_ряд1\":[[0.2,3.8],[0.3,4.0],[0.4,4.5]],\"модельный_ряд2\":[[0.2,4.8],[0.3,5.0],[0.4,6.5]]}}}";
  Print(in);
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  for (int i = 0; i < ArraySize (js.m_e); i++)
  {
    Print("---");
    Print(js.m_e[i].m_key);
    
    for (int i1 = 0; i1 < ArraySize (js.m_e [i].m_e); i1++)
    {
      CJAVal* j1=GetPointer(js.m_e[i].m_e[i1]);
      Print("   : ", j1.m_key);
      
      for (int i2 = 0; i2 < ArraySize (j1. m_e); i2++)
      {
        CJAVal* j2=GetPointer(j1.m_e[i2]);
        for (int i3 = 0; i3 < ArraySize (j2. m_e); i3++)
        {
           CJAVal* j3=GetPointer(j2.m_e[i3]);
           Print("         : ", j3.m_key, " :", j3.ToDbl());
        }
      }
    }
  }
}
 

MUITO OBRIGADO a todos que responderam!!!!

{
  "server_time": 1519120845,
  "pairs": {
    "btc_usd": {
      "decimal_places": 3,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_rur": {
      ...
    },
    "btc_eur": {
      ...

receberemos os nomes dos casais:

CJAVal dataM;
...
dataM.Deserialize(ttt);   
Print(dataM.m_e[0].m_key);
Print(dataM.m_e[1].m_key);
for (int i1 = 0; i1 < ArraySize (dataM.m_e [1].m_e); i1++)
  {
    CJAVal* j1=GetPointer(dataM.m_e[1].m_e[i1]);
    Print("   :-", j1.m_key);
  }

Resumindo:

server_time
pairs
:-btc_usd
:-btc_rur
:-btc_eur
:-ltc_btc
...

o que precisávamos!

 
o_o:

você tem uma matriz em uma matriz. portanto, é necessário adicionar outro nível de loop i3

Feitiçaria, nível 82.

Você não consegue simplificar isso?

 
Andrey Dik:

feitiçaria, 82º nível.

Você não poderia simplificar mais?

Como assim? Foram vocês que fizeram as matrizes tão profundas.