Preguntas sobre POO en MQL5 - página 63

 
Igor Makanu:

ponlo en el Buy More.

¡imho, es lo correcto!

json es un formato bien establecido, es conveniente para mí tener 100% de las clases de uno a uno en C # y en MQL , y para organizar la carga de modelos en tiempo de ejecución - hasta ahora hay un punto muerto en esa dirección

y pasar datos binarios aquí y allá.... Bueno, no es una novedad y sólo los perezosos pueden hacerlo)))


ZS: Python también parece funcionar con json sin problemas, no sé qué le ha dado Metaquotes a los pythonistas con sus nuevas capacidades de MT5 - ¿sólo bombear datos históricos? - ¿Cuál es el punto? No era el problema, en mi opinión.

La pereza. Todavía no lo necesito (json).

 

C#

namespace ConsoleApp4
{

    public class Rootobject
    {
        public Test test { get; set; }
        public int a { get; set; }
        public long b { get; set; }
    }

    public class Test
    {
        public int a { get; set; }
        public float b { get; set; }
        public string t { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var obj = new Rootobject { a = 555, b = long.MinValue, test = new Test { a = 10, b = 0.369 F, t = "Hi" } };
            string json = JsonSerializer.Serialize<Rootobject>(obj);
            Console.WriteLine(json);
            Console.ReadLine();
        }
    }
}

resultado:

C#

{"test":{"a":10,"b":0.368999988,"t":"Hi"},"a":555,"b":-9223372036854775808}

MQL:

{"test":{"a":10,"b":0.369,"t":"Hi"},"a":555,"b":-9223372036854775808}


¡definitivamente un WILDERFUL!

;)

 

Sospecho que ya te estoy aburriendo con mis deseos, pero necesito matrices de objetos

por mi cuenta, no puedo ((()

necesitan un ejemplo así:

class CJSon{
   string text;
public:
   CJSon():text(NULL){}
   CJSon* Push(string key,string value) {text+=COMMA+"\""+key+"\":\""+value+"\""; return &this;}
   CJSon* PushStruct(string key,string value) {text+=COMMA+"\""+key+"\":"+value; return &this;}
   CJSon* Push(string key,long value)   {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   CJSon* Push(string key,double value) {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   string Finish()   {return text+="}";}
};
#undef COMMA

class _CTest{
public:
   int a;
   double b;
   string t;
   _CTest(int _a,double _b,string _t):a(_a),b(_b),t(_t){}
   string JSon()  {return (CJSon()).VALUE(a).VALUE(b).VALUE(t).Finish();}
};

class CTest{
   _CTest test[5];
public:
   int a;
   long b;
public:
   CTest():a(555),b(LONG_MIN)
   { 
      for(int i=ArraySize(test)-1; i>=0; i--) 
         {
            test[i].a = i;
            test[i].b = (double)i/10.0;
            test[i].t = (string)(i*2); 
         }
   }
   string JSon() {return (CJSon()).STRUCT(test).VALUE(a).VALUE(b).Finish();}
};

el resultado debería ser:

{"test":[{"a":4,"b":0.4,"t":"8"},{"a":3,"b":0.3,"t":"6"},{"a":2,"b":0.2,"t":"4"},{"a":1,"b":0.1,"t":"2"},{"a":0,"b":0.0,"t":"0"}],"a":555,"b":-9223372036854775808}

 
Igor Makanu:

Sospecho que ya estoy aburrido de mis deseos, pero necesito matrices de objetos
yo mismo, no puedo (((

Por favor, dígame, tal vez me lo perdí en alguna parte, pero aún así,
¿cuál es exactamente su problema con la solución de serialización/deserialización json ya hecha?

JSON Serialization and Deserialization (native MQL)
JSON Serialization and Deserialization (native MQL)
  • www.mql5.com
Сериализация и десериализация JSON-протокола. Портированный код со скоростной библиотеки С++. Практичный пример: авторизация на сайте и парсинг ответа Благодарности принимаются в виде примеров, кто как применяет MQL для работы с веб-ресурсами. Поделитесь своим опытом работы с JSON в MQL. В протокол добавлены функции Escape / Unescape...
 
Sergey Dzyublik:

Por favor, dígame, tal vez me lo perdí en alguna parte, pero aún así,
¿cuál es exactamente su problema con una solución de serialización/deserialización json out-of-the-box?

La solución KB implica la generación independiente de los campos de los objetos en json

la solución propuesta por@Vladimir Simakov lo hace más conveniente

 
Igor Makanu:

la solución de KB implica la generación independiente de los campos de los objetos en json
en la solución propuesta por@Vladimir Simakov esto se hace más convenientemente

Usted tiene una comprensión muy específica del término "generación independiente":

class _CTest{
public:
   int a;
   double b;
   string t;
   _CTest(int _a,double _b,string _t):a(_a),b(_b),t(_t){}
   string JSon()  {return (CJSon()).VALUE(a).VALUE(b).VALUE(t).Finish();}
};

Por lo visto, es más cómodo que te resuelvan la tarea y le has cogido el gusto...

 
Sergey Dzyublik:

Tienes una comprensión muy específica del término "autoformación":

Al parecer, la solución es más conveniente porque te han resuelto el problema y le has cogido el gusto...

Es difícil sugerir lo que te mueve, si querías ayudar, ayudabas, si no querías, cerrabas el hilo y seguías con lo tuyo

y una vez más tratando de discutir las características personales de los miembros del foro.... casarse, señor!" (s) - habrá alguien que se meta en tu cabeza cuando no tengas nada mejor que hacer.


para el punto:

Estoy tratando de averiguar dónde poner el corchete, pero los resultados son decepcionantes.

#define ARRCOMMA (arrtext==NULL?"[":",")
...
CJSon* PushArray(string key,string value) {text+= COMMA + "\""+key+"\":"+ ARRCOMMA + value;  return &this;}

si me aburro con la selección, meteré [] con trucos más sucios )))

 
Igor Makanu:

Es difícil adivinar lo que te motiva, si querías ayudar, ayudabas, si no querías, cerrabas el hilo y seguías a lo tuyo.

y una vez más tratar de discutir las características personales de los participantes del foro.... en general, "¡debería usted casarse, señor!" (s) - habrá alguien que le pique los sesos cuando no tenga nada mejor que hacer.


para el punto:

Estoy tratando de averiguar dónde poner el corchete, pero los resultados son decepcionantes.

si me aburro con la selección, meteré [] con trucos más sucios )))

#define  COMMA (text==NULL?"{":",")
#define  VALUE(dVal) Value(#dVal,dVal)
#define  STRUCT(dVal) Struct(#dVal,dVal)
#define  STRUCT_PTR(dVal) StructPtr(#dVal,dVal)
#define  ARRAY(dVal) Array(#dVal,dVal)
#define  ARRAY_STRUCT(dVal) ArrayStruct(#dVal,dVal)
#define  ARRAY_STRUCT_PTR(dVal) ArrayStructPtr(#dVal,dVal)

class CJSon{
   string text;
public:
   CJSon():text(NULL){}
   CJSon* Manual(string key,string _text) {text+=COMMA+"\""+key+"\":"+_text; return &this;}
   template<typename T>
   CJSon* Value(string key,T value) {text+=COMMA+"\""+key+"\":"+_Text(value); return &this;}
   template<typename T>
   CJSon* Struct(string key,T &value) {text+=COMMA+"\""+key+"\":"+value.JSon(); return &this;}
   template<typename T>
   CJSon* StructPtr(string key,T* value) {text+=COMMA+"\""+key+"\":"+(!CheckPointer(value)?"null":value.JSon()); return &this;}
   template<typename T>
   CJSon* Array(string key,T &value[]){
      text+=COMMA+"\""+key+"\":[";
      for (int i=0,count=ArraySize(value);i<count;text+=_Text(value[i++])+",");
      StringSetCharacter(text,StringLen(text)-1,']');
      return &this;}
   template<typename T>
   CJSon* ArrayStruct(string key,T &value[]){
      text+=COMMA+"\""+key+"\":[";
      for (int i=0,count=ArraySize(value);i<count;text+=value[i++].JSon()+",");
      StringSetCharacter(text,StringLen(text)-1,']');
      return &this;}
   template<typename T>
   CJSon* ArrayStructPtr(string key,T &value[]){
      text+=COMMA+"\""+key+"\":[";
      for (int i=0,count=ArraySize(value);i<count;++i) text+=(CheckPointer(value[i])==POINTER_INVALID?"null":value[i].JSon())+",");
      StringSetCharacter(text,StringLen(text)-1,']');
      return &this;}
   string Finish()   {return text+="}";}
private:
   string _Text(string value) {return "\""+value+"\"";}
   template<typename T>
   string _Text(T value) {return (string)value;}
};

#undef  COMMA

Se ha corregido y se ha añadido el procesamiento de punteros a objetos serializables al mismo tiempo.

PS. Parece que tendré que ponerlo en "kodobaza"))))

 
Vladimir Simakov:
class CTest{
   _CTest test[5];
public:
   int a;
   long b;
public:
   CTest():a(555),b(LONG_MIN)
   {
      for(int i=ArraySize(test)-1; i>=0; i--) 
         {
            test[i].a = i;
            test[i].b = (double)i/10.0;
            test[i].t = (string)(i*2); 
         }
      
   }
   
   string JSon() {return (CJSon()).ARRAY_STRUCT(test).VALUE(a).VALUE(b).Finish();}
};

void OnStart(){
   CTest test;
   Print(test.JSon());
 }

debería ser así (el salto de línea no es necesario - lo añadí a mano):

{"test":[
         {"a":0,"b":0.0,"t":"0"},
         {"a":1,"b":0.1,"t":"2"},
         {"a":2,"b":0.2,"t":"4"},
         {"a":3,"b":0.3,"t":"6"},
         {"a":4,"b":0.4,"t":"8"}],
         "a":555,"b":-9223372036854775808}

ahora es así:

{"test":[
         "{" a":0," b":0.0," t":"0"}",
         "{" a":1," b":0.1," t":"2"}",
         "{" a":2," b":0.2," t":"4"}",
         "{" a":3," b":0.3," t":"6"}",
         "{" a":4," b":0.4," t":"8"}"],
         "a":555,"b":-9223372036854775808}
 
Vladimir Simakov:

PS. Parece que tendremos que ponerlo en la "kodobase" ))))

imho, gran trabajo, hay preguntas, por supuesto, la rapidez con que lo hizo.... si aquí en el curso de este una hora.... Bueno, eso es un poco exagerado.

comprobado la versión editada - ok, todo funciona correctamente