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

 

La librería es muy útil. Pero me he encontrado con que al serializar valores de tipo double hay una fuerte pérdida de precisión.

Ejemplo:

double minutos_abiertos[] = {0.95347, 0.95317, 0.95324}

for (int i=0; i<ArraySize(minutos_abiertos); ++i) jv["minutos_abiertos"].Add(minutos_abiertos[i]);

Tras la serialización obtengo:

"minutes_open":[9.53e-01,9.53e-01,9.53e-01]

Es decir, simplemente se pierden los 2 últimos caracteres significativos y todos los valores del array pasan a ser simplemente iguales entre sí. Como resultado, todos los cálculos basados en estos datos van en vano....

Al final lo solucioné convirtiendo los valores del array en cadena.

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Hola a todos

La documentación de la librería JAson no está completa en este sitio. Escribí documentación con más detalles y añadí pruebas unitarias: https://github.com/vivazzi/JAson. Puede ser útil para alguien.

Además, he creado una incidencia que describe un error en el uso de Json interno (objeto CJAVal): https://github.com/vivazzi/JAson/issues/1.

El objeto CJAVal no se asigna correctamente a otro objeto CJAVal como objeto:

CJAVal data;

// estructura simple
data["a"] = 12;

// estructura anidada
CJAVal nested_data;
nested_data["k1"] = 7;
nested_data["k2"] = "baz";

data["b"] = nested_data;

Print(data["b"]["k1"].ToInt());  // 0 en lugar de 7
Print(data["b"]["k2"].ToStr());  // "" en lugar de "baz"
Print(data.Serialize());  // {"a":12,"":{"k1":7, "k2": "baz"}, "b":{}} en lugar de {"a":12, "b":{"k1":7, "k2": "baz"}}

Como solución, es necesario utilizar el método Set():

data["b"].Set(nested_data);

Print(data["b"]["k1"].ToInt());  // 7
Print(data["b"]["k2"].ToStr());  // "baz"
Print(data.Serialize());  // {"a":12,"b":{"k1":7,"k2":"baz"}}

Si alguien puede ayudar, entonces muchos MQL-desarrolladores estarán agradecidos ya que este error ha existido durante muchos años.

 

¡¡¡Hola a todos!!!

La documentación de JAson no está completa en este sitio, así que escribí una documentación más detallada https://github.com/vivazzi/JAson/ y añadí pruebas unitarias: tal vez alguien la encuentre útil.

Y describí el problema de usar un Json anidado (objeto CJAVal): https://github.com/vivazzi/JAson/issues/1.

El objeto CJAVal no se guarda correctamente si se utiliza el signo "=" (se guarda la clave vacía):

CJAVal data;

// estructura simple
data["a"] = 12;

// estructura anidada
CJAVal nested_data;
nested_data["k1"] = 7;
nested_data["k2"] = "baz";

data["b"] = nested_data;

Print(data["b"]["k1"].ToInt());  // 0 en lugar de 7
Print(data["b"]["k2"].ToStr());  // "" en lugar de "baz"
Print(data.Serialize());  // {"a":12,"":{"k1":7, "k2": "baz"}, "b":{}} en lugar de {"a":12, "b":{"k1":7, "k2": "baz"}}

Sí, en las pruebas adjuntas en la página de la librería en este sitio, se puede encontrar que es necesario utilizar el método Set():

data["b"].Set(nested_data);

Print(data["b"]["k1"].ToInt());  // 7
Print(data["b"]["k2"].ToStr());  // "baz"
Print(data.Serialize());  // {"a":12,"b":{"k1":7,"k2":"baz"}}

Pero si alguien puede arreglar la librería para que sea posible guardar estructuras Json anidadas mediante el signo "=", ayudaría a mucha gente. Ya que he notado que algunas personas piensan que la librería tiene errores cuando intentan asignar un CJAVal anidado de la manera usual vía "=".

Espero que esto sea posible incluso dentro del lenguaje MQL. He intentado corregirlo yo mismo, pero no tengo un conocimiento profundo del lenguaje MQL, y hasta ahora no ha funcionado hacer la asignación vía "=".

vivazzi/JAson
vivazzi/JAson
  • vivazzi
  • github.com
Realization of JSON protocol in mql4 / mql5. You can create JSON object with data of different types and run serialization and deserialization of JSON data. Installing Usage Add and create object to work with JSON data. See simple example for easy understand: WARNING : To assign other object to current, use method instead of using the "=" sign...
 
Артём Мальцев:

¡Hola!

La documentación de la librería JAson no está completa en este sitio. Escribí documentación con más detalles y añadí pruebas unitarias: https://github.com/vivazzi/JAson. Puede ser útil para alguien.

Además, he creado una incidencia que describe un error en el uso de Json interno (objeto CJAVal): https://github.com/vivazzi/JAson/issues/1.

El objeto CJAVal no se asigna correctamente a otro objeto CJAVal como objeto:

Como solución, es necesario utilizar el método Set():

Si alguien puede ayudar, entonces muchos desarrolladores de MQL estarán agradecidos ya que este error ha existido durante muchos años.

El problema está en el método Copy.

        virtual bool Copy(const CJAVal &a) {
            m_key=a.m_key;
            CopyData(a);
            return true;
    }

La clave se sobrescribe con la clave del subobjeto en su ejemplo la "b" se sobrescribe con la clave de "nested_data" que está vacío.

He utilizado esta solución simple, no totalmente probado:

virtual bool Copy(const CJAVal &a) { if(m_key=="") m_key=a.m_key; CopyData(a); return true; }
 

Gracias, Laszlo Tormasi - ¡tu corrección funciona y todas las pruebas han pasado!

He actualizado JAson con sus correcciones: https://github.com/vivazzi/JAson

 

El problema de la asignación de estructuras Json anidadas mediante el signo "=" ha sido resuelto por Laszlo Tormasi en el comentario https://www.mql5.com/en/forum/65320/page3#comment_21453129.

Versión JAson con edicionesen https://github.com/vivazzi/JAson.


¡Gracias a todos los que trataron de entender el problema y ayudar!

Libraries: JSON Serialization and Deserialization (native MQL)
Libraries: JSON Serialization and Deserialization (native MQL)
  • 2021.03.23
  • www.mql5.com
JSON Serialization and Deserialization (native MQL): Author: o_O...
 
¿Cómo manipular la serialización y deserialización genéricas?
 

Se ha corregido un error ("array fuera de rango") que se producía con índices de array negativos. Ahora el operador [] devuelve NULL.

El procesamiento tiene este aspecto.

void OnStart()
{
  CJAVal json, * jsC;

  // añadir 
  json[0] = 0;
  json[1] = 1;
  json[2] = 2;
  
  // comprobar
  if ((jsC = json[-1]) == NULL)
    Print("Error. jsC is null!");
}

Además, añadí el método ToIntI por conveniencia. Ya que ToInt devuelve long.

int ToIntI() const { return (int)m_iv; }
Archivos adjuntos:
JAson.mqh  31 kb
JasonTest.mq5  2 kb
 

No entiendo cómo leer el json anidado.

Aquí hay una cadena como esta:

string str=

{
  "key1": [
    {
      "key2": [
        {
          "key3": "val)"
        },
        {},
        {}
      ]
    }
  ]
}

¿Cómo puedo leerlo y acceder a los elementos?

CJAVal data;
data.Deserialize(str);
Print(data["key1"][0][0]["key3"].ToStr());
Por más que lo intento, no funciona.
 
leonerd #:

No entiendo cómo leer el json anidado.

Aquí hay una cadena como esta:

¿Cómo la leo y accedo a los elementos?

Por más que lo intento, no lo consigo.
string str;
CJAVal data;

str=
"{"
"  \"key1\": ["
"    {"
"      \"key2\": ["
"        {"
"          \"key3\": \"val)\""
"        },"
"        {},"
"        {}"
"      ]"
"    }"
"  ]"
"}";

data.Deserialize(str);
Print(data["key1"][0]["key2"][0]["key3"].ToStr());

Si no entiendes la estructura de tu cadena json o algo va mal, haz lo siguiente:

string str;
CJAVal data; 
CJAVal *value;

str=
"{"
"  \"key1\": ["
"    {"
"      \"key2\": ["
"        {"
"          \"key3\": \"val)\""
"        },"
"        {},"
"        {}"
"      ]"
"    }"
"  ]"
"}";

data.Deserialize(str);

if ((value = data["key1"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value[0]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value["key2"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value[0]) == NULL) {
  Print("value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value["key3"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

Print(value.ToStr());

Para entender fácilmente la estructura de una cadena json utiliza este sitio: https: //jsoneditoronline.org/.

JSON Editor Online - view, edit and format JSON online
  • Jos de Jong
  • jsoneditoronline.org
JSON Editor Online is a web-based tool to view, edit, format, transform, and diff JSON documents.