Вопросы по ООП в MQL5 - страница 63

 
Igor Makanu:

выложите в КБ

имхо, нужная вещь!

json устоявшийся формат, мне удобно иметь возможность на 100% один в один классы в C# и в MQL , и организовать загрузку моделей в рантайм - пока в этом направлении затык

а гонять бинарные данные тудым-сюдым.... ну вроде как уже не новинка и не умеет это делать только ленивый )))


ЗЫ: Питон кажется тож без проблем с json работает, не понятно что дали питонистам Метаквоты своими новыми возможностями МТ5 - тупо выкачать исторические данные? - смысл? это и не было проблемой, имхо

Лень. Там, часов несколько, "напильником" пилить надо, а мне он пока (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.369F, t = "Hi" } };
            string json = JsonSerializer.Serialize<Rootobject>(obj);
            Console.WriteLine(json);
            Console.ReadLine();
        }
    }
}

результат:

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}


однозначно ВОЛШЕБНИК!

;)

 

подозреваю, что уже надоел своими хотелками, но нужны массивы обьектов

сам, не могу (((

нужен такой пример:

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

результат такой должен быть:

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

подозреваю, что уже надоел своими хотелками, но нужны массивы обьектов
сам, не могу (((

Подскажите, пожалуйста, может где-то пропустил, но все же,
чем именно вас не устраивает уже готовое решение по сереализаци/десериализации json?

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

Подскажите, пожалуйста, может где-то пропустил, но все же,
чем именно вас не устраивает уже готовое решение по сереализаци/десериализации json?

в КБ решение подразумевает самостоятельное формирование полей обьектов в json

в решении предложенном @Vladimir Simakov это сделано более удобно

 
Igor Makanu:

в КБ решение подразумевает самостоятельное формирование полей обьектов в json
в решении предложенном @Vladimir Simakov это сделано более удобно

У вас очень специфическое понимание термина "самостоятельное формирование":

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

Видимо решение более удобно тем, что за вас вам решили вашу задачу и вы вошли во вкус...

 
Sergey Dzyublik:

У вас очень специфическое понимание термина "самостоятельное формирование":

Видимо решение более удобно тем, что за вас вам решили вашу задачу и вы вошли во вкус...

сложно предположить что вами движет, захотел помочь - помог, не захотел - закрыл топик и занялся своими делами

а в очередной раз пытаться обсудить личностные характеристики участников форума.... в общем "жениться вам надо, барин!"(с) - будет кому по мозгам проехать когда делать нечего


по сабжу:

подбираю куда квадратную скобку воткнуть, результаты плачевные

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

если надоест подбором заниматься, то  буду вставлять [] более грязными трюками )))

 
Igor Makanu:

сложно предположить что вами движет, захотел помочь - помог, не захотел - закрыл топик и занялся своими делами

а в очередной раз пытаться обсудить личностные характеристики участников форума.... в общем "жениться вам надо, барин!"(с) - будет кому по мозгам проехать когда делать нечего


по сабжу:

подбираю куда квадратную скобку воткнуть, результаты плачевные

если надоест подбором заниматься, то  буду вставлять [] более грязными трюками )))

#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

Поправил, заодно и обработку указателей на сериализуемые объекты добавил.

PS. Похоже так и придется в "кодобазу" выложить)))

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

нужно так (перенос строки не нужен - я руками добавил):

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

сейчас так:

{"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. Похоже так и придется в "кодобазу" выложить)))

имхо, отличная работа, есть вопросы конечно, насколько быстро Вы ее сделали....если вот в течении  этого течении часа.... ну как бы выше всяческих эмоций!

проверил правленую версию  - ОК, все корректно работает