Domande su OOP in MQL5 - pagina 63

 
Igor Makanu:

metterlo nel Buy More.

imho, è la cosa giusta!

json è un formato consolidato, è conveniente per me avere classi al 100% uno-a-uno in C# e in MQL , e per organizzare il caricamento dei modelli in runtime - finora c'è un punto morto in quella direzione

e passare dati binari qui e là.... Beh, non è una novità e solo una persona pigra può farlo)))


ZS: Python sembra funzionare anche con json senza problemi, non so cosa Metaquotes ha dato ai pitonisti con le sue nuove funzionalità MT5 - solo pompare i dati storici? - Qual è il punto? Non era il problema, imho

Pigrizia. Non ne ho ancora bisogno (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();
        }
    }
}

risultato:

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}


sicuramente un WILDERFUL!

;)

 

Sospetto che vi sto già annoiando con i miei desideri, ma ho bisogno di array di oggetti

da solo, non posso (((()

hanno bisogno di un tale esempio:

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

il risultato dovrebbe essere:

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

Sospetto di essere già annoiato dai miei desideri, ma ho bisogno di array di oggetti
me stesso, non posso (((

Per favore dimmi, forse l'ho perso da qualche parte, ma comunque,
qual è esattamente il tuo problema con la soluzione di serializzazione/deserializzazione json già pronta?

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

Puoi dirmi se mi sono perso da qualche parte, ma comunque,
qual è esattamente il tuo problema con una soluzione di serializzazione/deserializzazione json out-of-the-box?

La soluzione KB permette di generare campi oggetto in json da soli.

la soluzione proposta da@Vladimir Simakov lo rende più conveniente

 
Igor Makanu:

la soluzione KB implica la generazione indipendente di campi oggetto in json
nella soluzione proposta da@Vladimir Simakov questo è fatto in modo più conveniente

Lei ha una comprensione molto specifica del termine "generazione indipendente":

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

Apparentemente è più comodo avere il tuo compito risolto per te e tu hai il gusto di farlo...

 
Sergey Dzyublik:

Lei ha una comprensione molto specifica del termine "autoformazione":

Apparentemente la soluzione è più conveniente perché hai avuto il tuo problema risolto per te e ci hai preso gusto...

È difficile suggerire cosa ti motiva, se volevi aiutare, hai aiutato, se non volevi, hai chiuso il thread e sei andato avanti con i tuoi affari

e ancora una volta cercando di discutere le caratteristiche personali dei membri del forum.... dovresti sposarti, sirin" - ci sarà qualcuno che ti darà un passaggio sopra la testa quando non avrai niente di meglio da fare.


per il punto:

Sto cercando di capire dove mettere la parentesi quadra, ma i risultati sono deludenti.

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

se mi annoio con la selezione, inserirò [] con trucchi più sporchi )))

 
Igor Makanu:

È difficile indovinare cosa ti motiva, se volevi aiutare, hai aiutato, se non volevi, hai chiuso il thread e sei andato per i fatti tuoi.

e ancora una volta cercare di discutere le caratteristiche personali dei partecipanti al forum.... in generale, "dovrebbe sposarsi, signore!" (s) - ci sarà qualcuno che vi prenderà in giro quando non avrete niente di meglio da fare.


per il punto:

Sto cercando di capire dove mettere la parentesi quadra, ma i risultati sono deludenti.

se mi annoio con la selezione, inserirò [] con trucchi più sporchi )))

#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

Corretto e aggiunto l'elaborazione di puntatori a oggetti serializzabili allo stesso tempo.

PS. Sembra che dovrò metterlo in "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());
 }

dovrebbe essere così (l'interruzione di linea non è necessaria - l'ho aggiunta 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}

ora è così:

{"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. Sembra che dovremo metterlo nel "kodobase" ))))

imho, grande lavoro, ci sono domande naturalmente, quanto velocemente hai fatto.... se qui nel corso di questo un'ora.... Beh, questo è un po' esagerato!

controllato la versione modificata - ok, tutto funziona correttamente


Motivazione: