MQL5'te OOP hakkında sorular - sayfa 63

 
Igor Makanu :

KB'ye koy

IMHO, gerekli bir şey!

json köklü bir format, C# ve MQL'de %100 bire bir sınıflara sahip olabilmek ve çalışma zamanında modellerin yüklenmesini organize edebilmek benim için uygun - şimdilik, bu yönde takarak

ama burada ve orada ikili verileri sürmek .... iyi, artık bir yenilik değil ve sadece tembel insanlar bunu yapamaz)))


Not: Python da json ile sorunsuz çalışıyor gibi görünüyor, Metaquotes'un pitonistlere yeni MT5 yetenekleriyle ne verdiği açık değil - aptalca tarihsel verileri dışarı pompalamak mı? - anlam? sorun değildi amk

Tembellik. Orada, birkaç saat boyunca bir "dosya" ile kesmek gerekiyor, ama benim için henüz (json) ve nafik düşmedi.

 

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

sonuç:

C#

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

MQL:

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


Kesinlikle SİHİRBAZ!

;)

 

İstek Listemden zaten bıktığımdan şüpheleniyorum, ancak bir dizi nesneye ihtiyacımız var

kendim, yapamam

Bunun gibi bir örneğe ihtiyacım var:

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

sonuç şöyle olmalı:

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

İstek Listemden zaten bıktığımdan şüpheleniyorum, ancak bir dizi nesneye ihtiyacımız var
kendim, yapamam

Söyle bana, lütfen, belki bir yerlerde gözden kaçırmışımdır, ama yine de,
json'un seri hale getirilmesi/seri hale getirilmesi için hazır bir çözümde tam olarak size uymayan nedir?

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

Söyle bana, lütfen, belki bir yerlerde gözden kaçırmışımdır, ama yine de,
json'un seri hale getirilmesi/seri hale getirilmesi için hazır bir çözümde tam olarak size uymayan nedir?

KB'de çözüm, json'da nesne alanlarının bağımsız oluşumunu ima eder

@Vladimir Simakov tarafından önerilen çözümde daha rahat yapılır

 
Igor Makanu :

KB'de çözüm, json'da nesne alanlarının bağımsız oluşumunu ima eder
@Vladimir Simakov tarafından önerilen çözümde daha rahat yapılır

"Kendini oluşturma" terimi hakkında çok özel bir anlayışınız var:

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

Görünüşe göre çözüm daha uygun çünkü göreviniz sizin için çözüldü ve tadına baktınız ...

 
Sergey Dzyublik :

"Kendini oluşturma" terimi hakkında çok özel bir anlayışınız var:

Görünüşe göre çözüm daha uygun çünkü göreviniz sizin için çözüldü ve tadına baktınız ...

seni neyin tahrik ettiğini tahmin etmek zor, yardım etmek istedi - yardım etti, istemedi - konuyu kapattı ve işine devam etti

ve bir kez daha forum katılımcılarının kişisel özelliklerini tartışmaya çalışın .... genel olarak, "evlenmeniz gerekiyor efendim!" (c) - yapacak bir şey olmadığında beyinleri dolaşacak biri olacak


konuya göre:

Köşeli ayracı nereye koyacağımı seçiyorum, sonuçlar içler acısı

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

seçimi yapmaktan yorulursam, o zaman daha kirli numaralarla [] ekleyeceğim)))

 
Igor Makanu :

seni neyin tahrik ettiğini tahmin etmek zor, yardım etmek istedi - yardım etti, istemedi - konuyu kapattı ve işine devam etti

ve bir kez daha forum katılımcılarının kişisel özelliklerini tartışmaya çalışın .... genel olarak, "evlenmeniz gerekiyor efendim!" (c) - yapacak bir şey olmadığında beyinleri dolaşacak biri olacak


konuya göre:

Köşeli ayracı nereye koyacağımı seçiyorum, sonuçlar içler acısı

seçimi yapmaktan yorulursam, o zaman daha kirli numaralarla [] ekleyeceğim)))

 #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

Serileştirilebilir nesnelere aynı anda işaretçilerin işlenmesi düzeltildi, eklendi.

not. Bunun "kod tabanında") düzenlenmesi gerekecek gibi görünüyor)))

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

buna böyle ihtiyacınız var (satır sonu gerekli değil - manuel olarak ekledim):

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

şimdi böyle:

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

not. Görünüşe göre bunun "kod tabanına" konulması gerekecek)))

IMHO, mükemmel iş, sorular var, tabii ki, ne kadar çabuk yaptın .... eğer bu saatte .... peki, olduğu gibi, tüm duyguların üstünde!

düzeltilmiş sürümü kontrol etti - Tamam, her şey doğru çalışıyor


Neden: