Questions sur la POO dans MQL5 - page 63

 
Igor Makanu:

mettez-le dans le Buy More.

imho, c'est la bonne chose à faire !

json est un format bien établi, il est pratique d'avoir des classes 100% one-to-one en C# et en MQL, et d'avoir la possibilité de charger les modèles en runtime - jusqu'à présent, il y a une impasse dans cette direction.

et passer des données binaires ici et là.... Eh bien, ce n'est pas une nouveauté et seule une personne paresseuse peut le faire))).


ZS : Python semble également fonctionner avec json sans aucun problème, je ne sais pas ce que Metaquotes a donné aux pythonistes avec ses nouvelles capacités MT5 - juste pomper des données historiques ? - Quel intérêt ? Ce n'était pas le problème, à mon avis.

La paresse. Je n'en ai pas encore besoin (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();
        }
    }
}

résultat :

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}


définitivement un WILDERFUL !

;)

 

Je pense que je vous ennuie déjà avec mes souhaits, mais j'ai besoin de tableaux d'objets

tout seul, je ne peux pas ((()

ont besoin d'un tel exemple :

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

le résultat devrait être :

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

Je soupçonne que mes souhaits sont déjà ennuyeux, mais j'ai besoin de tableaux d'objets
moi-même, je ne peux pas (((

Dites-moi, peut-être que j'ai manqué quelque part, mais quand même,
quel est exactement votre problème avec la solution de sérialisation/désérialisation json toute faite ?

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

Pouvez-vous me dire si je l'ai manqué quelque part, mais tout de même,
quel est exactement votre problème avec une solution de sérialisation/désérialisation json prête à l'emploi ?

La solution KB vous permet de générer vous-même les champs d'objet en json.

la solution proposée par@Vladimir Simakov le rend plus pratique

 
Igor Makanu:

la solution de KB implique la génération indépendante des champs d'objet dans json
dans la solution proposée par@Vladimir Simakov ceci est fait plus commodément

Vous avez une compréhension très spécifique du terme "génération indépendante" :

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

Apparemment, c'est plus pratique de se faire résoudre les tâches à sa place et vous avez le goût de le faire...

 
Sergey Dzyublik:

Vous avez une compréhension très spécifique du terme "auto-formation" :

Apparemment, la solution est plus pratique parce que votre problème a été résolu pour vous et que vous y avez pris goût...

Il est difficile de suggérer ce qui vous motive, si vous vouliez aider, vous avez aidé, si vous ne vouliez pas, vous avez fermé le fil et continué vos affaires.

et une fois de plus essayer de discuter des caractéristiques personnelles des membres du forum.... tu devrais te marier, sirin" - il y aura bien quelqu'un pour faire un tour sur ta tête quand tu n'auras rien de mieux à faire.


pour le point :

J'essaie de trouver où mettre le crochet, mais les résultats sont décevants.

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

si je me lasse de la sélection, je mettrai [] avec des trucs plus sales ;)))

 
Igor Makanu:

Il est difficile de deviner ce qui vous motive. Si vous vouliez aider, vous l'avez fait, si vous ne le vouliez pas, vous avez fermé le fil de discussion et avez vaqué à vos occupations.

et une fois de plus essayer de discuter des caractéristiques personnelles des participants au forum.... en général, "vous devriez vous marier, monsieur !" (s) - il y aura quelqu'un pour vous prendre la tête quand vous n'aurez rien de mieux à faire.


pour le point :

J'essaie de trouver où mettre le crochet, mais les résultats sont décevants.

si je me lasse de la sélection, je mettrai [] avec des trucs plus sales ;)))

#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

Correction et ajout du traitement des pointeurs vers des objets sérialisables en même temps.

PS. On dirait que je vais devoir le mettre dans "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());
 }

cela devrait être comme ceci (le saut de ligne n'est pas nécessaire - je l'ai ajouté à la main) :

{"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}

maintenant c'est comme ça :

{"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. On dirait qu'on va devoir le mettre dans la "kodobase")))).

imho, super boulot, il y a des questions bien sûr, à quelle vitesse vous l'avez fait.... si ici au cours de cette heure.... C'est un peu exagéré !

vérifié la version éditée - ok, tout fonctionne correctement