Bibliotecas: JSON Serialization and Deserialization (native MQL) - página 10

 

fijo

1.13

Archivos adjuntos:
JAson.mqh  31 kb
 
o_o:
Sí, probablemente no entendí cuál era tu problema, las líneas que mostraste que eras capaz de conseguir todo.
{
  "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": {
      ...

El intercambio da esta respuesta.... (y el número de pares puede ser diferente... por ejemplo, si el intercambio se apagará o añadir algunos pares).

Necesito de alguna manera obtener todos los nombres de los pares en la respuesta (btc_usd, btc_rur, btc_eur, etc.) en un bucle o a través de una llamada recursiva, no importa.... No puedo averiguar cómo obtener el primer y el siguiente nombre de un par... No sé cómo obtener el primer y el siguiente nombre de un par....

 
Delta.800:

la bolsa da esta respuesta.... (y el número de pares puede ser diferente.... por ejemplo, si la bolsa desconecta o añade algún par).

Necesito de alguna manera obtener todos los nombres de los pares en la respuesta (btc_usd, btc_rur, btc_eur, etc.) en un bucle o a través de una llamada recursiva, no importa.... No puedo averiguar cómo obtener el primer y el siguiente nombre de un par... No consigo averiguar cómo obtener el primer y el siguiente nombre de un par... No consigo averiguarlo....

Corta la cadena al principio

{
  "server_time": 1519120845,
  "pairs": 

A continuación, elimine el } al final de la cadena

Luego alimenta la cadena al analizador sintáctico.

Llena tu estructura con los datos del analizador. Y luego haz lo que quieras con tu estructura - nombres de pares, etc.

 
Andrey Dik:

Recorta la línea del principio

A continuación, elimine al final de la línea }

A continuación, introduzca la cadena en el analizador sintáctico.

Llene su estructura con los datos del analizador sintáctico. Y luego haz lo que quieras con tu estructura - nombres de pares, etc.

"Luego alimenta la cadena en el parser". - ¿es correcto? dataM.Deserialize(ttt);

"Llena tu estructura con los datos del parser". - ¿cómo hacerlo? por favor, dame una línea..... (no necesitas describir la estructura))

ss Me refería a una estructura simple, no a una orientada a objetos, como por ejemplo

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;
        }
};
Creo que hay algo similar aquí, pero no puedo entenderlo. (No soy bueno en OOP, todavía...).
 
o_o:

fijo

1.13

Prueba este ejemplo:

#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:

"Luego alimenta la cadena al analizador sintáctico". - ¿es correcto? dataM.Deserialize(ttt);

"Rellena la estructura con los datos del parser". - ¿cómo hacerlo? por favor, dame una línea..... (no necesitas describir la estructura))

Mira en mi ejemplo sobre empresas y rango de modelos - muestra como obtener datos del parser.....


o_o:

fijo

1.13

Sin embargo..... Desensambla y recoge la sincronización perfectamente, pero no puedo obtener datos.... ¿quizás sin dables, ints, etc.? - dejar la cadena como está en forma de cadena y luego decidir cómo tratar con esta cadena desde el exterior.

 
Andrey Dik:

Sin embargo..... Desmonta y monta el término es genial, pero no consigo los datos.... ¿Quizás no necesitamos dables, ints, etc.? - deja la cadena como está en forma de cadena y luego decide cómo tratar esta cadena desde fuera.

Tienes un array en un array. significa que necesitas añadir otro bucle de nivel 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());
        }
      }
    }
  }
}
 

¡¡¡¡UN AGRADECIMIENTO ENORME a todos los que respondieron!!!!

{
  "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": {
      ...

los nombres de las parejas:

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);
  }

En resumen:

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

¡lo que necesitábamos!

 
o_o:

usted tiene una matriz en una matriz. por lo que necesita para agregar otro nivel de bucle i3

Hechicería, nivel 82.

¿No puedes hacerlo más simple?

 
Andrey Dik:

Hechicería, nivel 82

¿No podías hacerlo más simple?

¿Qué quieres decir? Ustedes son los que hicieron las matrices tan profundas.