Fragen zu OOP in MQL5 - Seite 63

 
Igor Makanu:

legen Sie es in die Buy More.

Imho ist es das Richtige!

json ist ein gut etabliertes Format, es ist praktisch für mich, 100% eins-zu-eins-Klassen in C# und in MQL zu haben und das Laden von Modellen zur Laufzeit zu organisieren - bis jetzt gibt es eine Sackgasse in dieser Richtung

und übergeben Sie hier und dort binäre Daten.... Nun, es ist keine Neuheit und nur eine faule Person kann es tun)))


ZS: Python scheint auch mit json ohne Probleme zu funktionieren, ich weiß nicht, was Metaquotes den Pythonisten mit seinen neuen MT5-Fähigkeiten gegeben hat - nur historische Daten auspumpen? - Worum geht es? Das war nicht das Problem, imho

Faulheit. Ich brauche es (json) noch nicht.

 

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

Ergebnis:

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}


definitiv ein WILDERFUL!

;)

 

Ich vermute, ich langweile Sie bereits mit meinen Wünschen, aber ich brauche Arrays von Objekten

allein kann ich nicht ((()

brauchen ein solches Beispiel:

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

sollte das Ergebnis sein:

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

Ich vermute, ich habe Sie bereits mit meinen Wünschen gelangweilt, aber ich brauche selbst Arrays von Objekten
, ich kann nicht (((

Bitte sagen Sie mir, vielleicht habe ich es irgendwo verpasst, aber immer noch,
was genau ist Ihr Problem mit der vorgefertigten Json Serialisierung/Deserialisierung Lösung?

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

Können Sie mir sagen, wenn ich es irgendwo verpasst, aber immer noch,
was genau ist Ihr Problem mit einer Out-of-the-Box-Json-Serialisierung/Deserialisierung-Lösung?

Die KB-Lösung ermöglicht es Ihnen, selbst Objektfelder in json zu erzeugen.

die von@Vladimir Simakov vorgeschlagene Lösung macht es bequemer

 
Igor Makanu:

die KB-Lösung impliziert eine unabhängige Generierung von Objektfeldern in json
in der von@Vladimir Simakov vorgeschlagenen Lösung wird dies bequemer durchgeführt

Sie haben ein sehr spezifisches Verständnis von dem Begriff "unabhängige Generation":

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

Offenbar ist es bequemer, wenn man seine Aufgaben für sich lösen lässt, und Sie sind auf den Geschmack gekommen...

 
Sergey Dzyublik:

Sie haben ein sehr spezifisches Verständnis des Begriffs "Selbstformung":

Offensichtlich ist die Lösung bequemer, denn Sie haben Ihr Problem für sich lösen lassen und sind auf den Geschmack gekommen...

Es ist schwer zu sagen, was dich antreibt. Wenn du helfen wolltest, hast du geholfen, wenn du nicht wolltest, hast du den Thread geschlossen und bist mit deinen Geschäften fortgefahren.

und wieder einmal versuchen, persönliche Eigenschaften von Forumsmitgliedern zu diskutieren.... Du solltest heiraten, Sirin" - es wird sich jemand finden, der dir über den Kopf streichelt, wenn du nichts Besseres zu tun hast.


auf den Punkt:

Ich versuche herauszufinden, wo ich die eckige Klammer anbringen soll, aber die Ergebnisse sind enttäuschend.

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

wenn mir die Auswahl zu langweilig wird, füge ich [] mit schmutzigeren Tricks ein )))

 
Igor Makanu:

Es ist schwer zu erraten, was dich motiviert. Wenn du helfen wolltest, hast du geholfen, wenn du nicht wolltest, hast du den Thread geschlossen und bist deiner Arbeit nachgegangen.

und wieder einmal versuchen, persönliche Eigenschaften von Forumsteilnehmern zu diskutieren.... im Allgemeinen: "Sie sollten heiraten, Sir!" (s) - es wird jemand da sein, der Ihnen den Kopf verdreht, wenn Sie nichts Besseres zu tun haben.


auf den Punkt:

Ich versuche herauszufinden, wo ich die eckige Klammer anbringen soll, aber die Ergebnisse sind enttäuschend.

wenn mir die Auswahl zu langweilig wird, füge ich [] mit schmutzigeren Tricks ein )))

#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

Es wurde behoben und gleichzeitig die Verarbeitung von Zeigern auf serialisierbare Objekte hinzugefügt.

PS. Sieht so aus, als müsste ich es in "kodobaza" eintragen ))))

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

sollte so aussehen (ein Zeilenumbruch ist nicht erforderlich - ich habe ihn von Hand eingefügt):

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

Jetzt ist es so:

{"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. Sieht aus, als müssten wir es in die "kodobase" aufnehmen)))

imho, tolle Arbeit, es gibt natürlich Fragen, wie schnell du es gemacht hast.... wenn hier im Laufe dieser einen Stunde.... Nun, das ist ein wenig übertrieben!

die bearbeitete Version überprüft - ok, alles funktioniert korrekt