Perguntas sobre OOP em MQL5 - página 63

 
Igor Makanu:

colocá-lo na Buy More.

imho, é a coisa certa!

json é um formato bem estabelecido, é conveniente ter 100% de classes um-para-um em C# e em MQL , e ter a possibilidade de carregar os modelos em tempo de execução - até agora há um impasse nesta direção

e passar dados binários aqui e ali.... Bem, não é uma novidade e só uma pessoa preguiçosa pode fazer isso))))


ZS: Python também parece trabalhar com a json sem problemas, não sei o que Metaquotes tem dado aos pythonistas com suas novas capacidades MT5 - apenas bombear dados históricos? - qual é o objetivo? não era o problema, imho

A preguiça. Ainda não preciso dele (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 um WILDERFUL!

;)

 

Suspeito que já estou aborrecendo você com meus desejos, mas preciso de conjuntos de objetos

sozinho, eu não posso ((()

precisam de tal exemplo:

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

o resultado deve 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:

Suspeito que já aborreci você com meus desejos, mas preciso de uma série de objetos
eu mesmo, eu não posso (((

Por favor me diga, talvez eu tenha perdido em algum lugar, mas ainda assim,
qual é exatamente o seu problema com a solução de serialização/desen serialização de json pronta?

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 me diga, talvez eu tenha perdido isso em algum lugar, mas ainda assim,
qual é exatamente o seu problema com uma solução de serialização/deserialização fora da caixa da json?

A solução KB implica a geração independente de campos de objetos na json

a solução proposta por@Vladimir Simakov a torna mais conveniente

 
Igor Makanu:

a solução KB implica a geração independente de campos de objetos na json
na solução proposta por@Vladimir Simakov isto é feito de forma mais conveniente

Você tem uma compreensão muito específica do termo "geração independente":

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

Aparentemente, é mais conveniente ter sua tarefa resolvida para você e você tem o gosto por ela...

 
Sergey Dzyublik:

Você tem uma compreensão muito específica do termo "auto-formação":

Aparentemente a solução é mais conveniente porque você já teve seu problema resolvido e tem gosto por ele...

É difícil sugerir o que o motiva, se você queria ajudar, ajudou, se não queria, você fechou o fio e continuou com seu negócio

e mais uma vez tentando discutir as características pessoais dos membros do fórum.... você deve se casar, senhor" - haverá alguém para dar uma volta na sua cabeça quando você não tiver nada melhor para fazer.


para o ponto:

Estou tentando descobrir onde colocar o colchete, mas os resultados são decepcionantes.

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

se eu ficar entediado com a seleção, eu vou ficar [] com truques mais sujos ))))

 
Igor Makanu:

É difícil adivinhar o que o motiva, se você queria ajudar, ajudou, se não queria, fechou o fio da meada e foi em direção ao seu negócio.

e mais uma vez tentar discutir as características pessoais dos participantes do fórum.... em geral, "você deve se casar, senhor!" (s) - haverá alguém para escolher seu cérebro quando você não tiver nada melhor para fazer.


para o ponto:

Estou tentando descobrir onde colocar o colchete, mas os resultados são decepcionantes.

se eu ficar entediado com a seleção, eu vou ficar [] com truques mais sujos ))))

#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

Fixou-o e acrescentou o processamento de ponteiros a objetos serializáveis ao mesmo tempo.

PS. Parece que terei que colocá-lo em "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());
 }

deveria ser assim (não é necessária a quebra de linha - acrescentei à mão):

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

agora é assim:

{"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 teremos que colocá-lo no "kodobase"))))

imho, ótimo trabalho, há perguntas, claro, quão rápido você chegou.... se aqui, no decorrer desta uma hora.... bem, isso é um pouco exagerado!

verificou a versão editada - ok, tudo funciona corretamente