MQL5中的OOP问题 - 页 63

 
Igor Makanu:

把它放在 "购买更多 "中。

我认为,这是正确的事情!

json是一种成熟的格式,对我来说,在C#和MQL中拥有100%的一对一的类是很方便的,并且可以组织加载模型到运行时 - 到目前为止,在这个方向上有一个僵局。

并在这里和那里传递二进制数据....好吧,这不是什么新鲜事,只有懒人才能做到)))。


ZS:Python似乎也可以毫无问题地与json一起工作,我不知道Metaquotes用其新的MT5功能给了pythonists什么--只是抽出历史数据?- 这不是问题,我认为有什么意义?

懒惰。我还不需要它(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();
        }
    }
}

结果。

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}


绝对是一个WILDERFUL!

;)

 

我怀疑我的愿望已经让你厌烦了,但我需要对象的数组

独自一人,我不能((())

需要这样一个例子。

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序列化/反序列化 解决方案到底有什么问题?

KB解决方案意味着独立生成json中的对象字段

@Vladimir Simakov 提出的解决方案使其更加方便。

 
Igor Makanu:

KB的解决方案意味着独立生成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:

你对 "自我形成 "一词有一个非常具体的理解。

显然,这个解决方案更方便,因为你的问题已经为你解决了,你已经尝到了甜头......

很难说是什么驱使你,如果你想帮忙,你就帮忙,如果你不想帮忙,你就关闭这个话题,继续做你的事。

并再次试图讨论论坛成员的个人特征....你应该结婚,Sarin"--在你无事可做的时候,会有人在你头上搭个便车。


为点。

我想弄清楚把方括号放在哪里,但结果令人失望。

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

如果我对选择感到厌烦,我会把[]用更脏的招数塞进去)))

 
Igor Makanu:

很难猜测你的动机是什么,如果你想帮忙,你就帮忙,如果你不想帮忙,你就关闭这个话题,继续做你的事。

并再次尝试讨论论坛参与者的个人特征....一般来说,"你应该结婚,先生!"(s)--当你无事可做的时候,会有人给你挑刺。


为点。

我想弄清楚把方括号放在哪里,但结果令人失望。

如果我对选择感到厌烦,我会把[]用更脏的招数塞进去)))

#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。看来我得把它放入 "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());
 }

它应该是这样的(不需要断行--我是用手添加的)。

{"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。看来我们必须把它放在 "kodobase "中))))

IMHO,伟大的工作,当然也有问题,你是如何快速做的....,如果在这一个小时的过程中....。这也太夸张了吧!

检查了编辑过的版本--好的,一切工作正常。