← К каталогу
Исходный код · ID 2344

jason.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный исходный файл представляет собой библиотеку на языке MQL5 для работы с форматом JSON. Она содержит один класс CJAVal, который моделирует значение JSON и поддерживает типы: не определено, null, логическое, целое, дробное, строка, массив и объект. Библиотека позволяет создавать, копировать, сравнивать и преобразовывать значения, а также формировать и разбирать текст JSON.

Класс предоставляет конструкторы для создания значений из различных скалярных типов, конструктор копирования и конструктор дочернего значения с указанием родителя. Деструктор освобождает ресурсы. Публичные методы обеспечивают доступ к элементам по ключу или индексу, поиск и проверку наличия ключа, добавление элементов, сериализацию и десериализацию, экранирование и восстановление строк.

Библиотека не является торговым советником, индикатором или скриптом: это вспомогательный include-файл для обработки данных JSON в программах на MQL5. В исходнике отсутствуют торговые операции, обработчики событий и входные параметры.

Состав библиотеки

Классов: 1 · методов: 50 · конструкторов: 8 · деструкторов: 1 · отдельных функций: 0

Классы
Класс class CJAVal

Класс для представления и обработки значений JSON: хранит значение одного из типов (не определено, null, логическое, целое, дробное, строка, массив, объект), поддерживает вложенные элементы, разбор и формирование текста JSON.

Методы и конструкторы
Метод · CJAVal void Clear()

Сбрасывает значение и связанные с ним дочерние элементы, возвращая объект в исходное пустое состояние.

Метод · CJAVal bool Copy(const CJAVal &a)

Копирует значение другого объекта вместе с его ключом и данными.

Метод · CJAVal void CopyData(const CJAVal &a)

Копирует данные значения из другого объекта: тип, скалярные поля и вложенные элементы.

Метод · CJAVal void CopyArr(const CJAVal &a)

Копирует вложенные элементы массива из другого объекта.

Конструктор · CJAVal CJAVal()

Создаёт пустое значение без типа и данных.

Конструктор · CJAVal CJAVal(CJAVal *aparent,enJAType atype)

Создаёт дочернее значение заданного типа с указанием родительского объекта.

Конструктор · CJAVal CJAVal(enJAType t,string a)

Создаёт значение указанного типа из переданной строки.

Конструктор · CJAVal CJAVal(const int a)

Создаёт значение целого типа из переданного числа.

Конструктор · CJAVal CJAVal(const long a)

Создаёт значение целого типа из переданного длинного целого числа.

Конструктор · CJAVal CJAVal(const double a)

Создаёт значение дробного типа из переданного числа.

Конструктор · CJAVal CJAVal(const bool a)

Создаёт значение логического типа из переданного значения.

Конструктор · CJAVal CJAVal(const CJAVal &a)

Создаёт копию переданного значения.

Деструктор · CJAVal ~CJAVal()

Освобождает ресурсы объекта при его удалении.

Метод · CJAVal bool IsNumeric()

Проверяет, является ли значение числовым (целым или дробным).

Метод · CJAVal CJAVal * FindKey(string akey)

Ищет вложенный элемент по имени ключа и возвращает указатель на него или пустой указатель.

Метод · CJAVal CJAVal * HasKey(string akey,enJAType atype)

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

Метод · CJAVal CJAVal * operator[](string akey)

Предоставляет доступ к вложенному элементу по имени ключа, создавая его при отсутствии.

Метод · CJAVal CJAVal * operator[](int i)

Предоставляет доступ к элементу массива по индексу, расширяя массив при необходимости.

Метод · CJAVal void operator=(const CJAVal &a)

Присваивает объекту значение другого объекта.

Метод · CJAVal void operator=(const int a)

Присваивает объекту целое значение.

Метод · CJAVal void operator=(const long a)

Присваивает объекту длинное целое значение.

Метод · CJAVal void operator=(const double a)

Присваивает объекту дробное значение.

Метод · CJAVal void operator=(const bool a)

Присваивает объекту логическое значение.

Метод · CJAVal void operator=(string a)

Присваивает объекту строковое значение.

Метод · CJAVal bool operator==(const int a)

Сравнивает значение с целым числом.

Метод · CJAVal bool operator==(const long a)

Сравнивает значение с длинным целым числом.

Метод · CJAVal bool operator==(const double a)

Сравнивает значение с дробным числом.

Метод · CJAVal bool operator==(const bool a)

Сравнивает значение с логическим значением.

Метод · CJAVal bool operator==(string a)

Сравнивает значение со строкой.

Метод · CJAVal bool operator!=(const int a)

Проверяет неравенство значения с целым числом.

Метод · CJAVal bool operator!=(const long a)

Проверяет неравенство значения с длинным целым числом.

Метод · CJAVal bool operator!=(const double a)

Проверяет неравенство значения с дробным числом.

Метод · CJAVal bool operator!=(const bool a)

Проверяет неравенство значения с логическим значением.

Метод · CJAVal bool operator!=(string a)

Проверяет неравенство значения со строкой.

Метод · CJAVal long ToInt()

Возвращает значение как целое число.

Метод · CJAVal double ToDbl()

Возвращает значение как дробное число.

Метод · CJAVal bool ToBool()

Возвращает значение как логическое.

Метод · CJAVal string ToStr()

Возвращает строковое представление значения.

Метод · CJAVal void FromStr(enJAType t,string a)

Записывает значение из строки с учётом указанного типа.

Метод · CJAVal string GetStr(char &js[],int i,int slen)

Извлекает строку из текстового представления JSON по позиции и длине.

Метод · CJAVal void Set(const CJAVal &a)

Устанавливает значение, копируя данные из другого объекта.

Метод · CJAVal void Set(const CJAVal &list[])

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

Метод · CJAVal CJAVal * Add(const CJAVal &item)

Добавляет переданный объект как элемент в массив или объект.

Метод · CJAVal CJAVal * Add(const int a)

Добавляет целое число как элемент в массив или объект.

Метод · CJAVal CJAVal * Add(const long a)

Добавляет длинное целое число как элемент в массив или объект.

Метод · CJAVal CJAVal * Add(const double a)

Добавляет дробное число как элемент в массив или объект.

Метод · CJAVal CJAVal * Add(const bool a)

Добавляет логическое значение как элемент в массив или объект.

Метод · CJAVal CJAVal * Add(string a)

Добавляет строку как элемент в массив или объект.

Метод · CJAVal CJAVal * AddBase(const CJAVal &item)

Добавляет переданный объект как базовый элемент в структуру.

Метод · CJAVal CJAVal * New()

Создаёт новый элемент значения и возвращает указатель на него.

Метод · CJAVal CJAVal * NewBase()

Создаёт новый базовый элемент структуры и возвращает указатель на него.

Метод · CJAVal string Escape(string a)

Экранирует специальные символы строки для корректного представления в JSON.

Метод · CJAVal string Unescape(string a)

Восстанавливает исходные символы из JSON-экранированной строки.

Метод · CJAVal void Serialize(string &js,bool bf,bool bcoma)

Формирует текстовое представление значения или структуры в формате JSON.

Метод · CJAVal string Serialize()

Возвращает текстовое представление значения или структуры в формате JSON.

Метод · CJAVal bool Deserialize(char &js[],int slen,int &i)

Разбирает текст JSON из массива символов и заполняет значения объекта.

Метод · CJAVal bool ExtrStr(char &js[],int slen,int &i)

Извлекает строковое значение при разборе текста JSON.

Метод · CJAVal bool Deserialize(string js,int acp)

Разбирает текст JSON из строки и заполняет значения объекта.

Метод · CJAVal bool Deserialize(char &js[],int acp)

Разбирает текст JSON из массива символов и заполняет значения объекта.

Получить полный код

Поиск по коду файла

??//+------------------------------------------------------------------?

//|                                                            JAson |

//|    This software is licensed under the MIT https://goo.gl/eyJgHe |

//+------------------------------------------------------------------+

#property copyright "Copyright ? 2006-2017"

#property version "1.08"

#property strict

#define DEBUG_PRINT false

//------------------------------------------------------------------ enum enJAType

enum enJAType { jtUNDEF,jtNULL,jtBOOL,jtINT,jtDBL,jtSTR,jtARRAY,jtOBJ };

//------------------------------------------------------------------ class CJAVal

class CJAVal

{

public:

   virtual void      Clear()

   {

      m_parent=NULL;

      m_key="";

      m_type=jtUNDEF;

      m_bv=false;

      m_iv=0;

      m_dv=0;

      m_sv="";

      ArrayResize(m_e,0);

   }

   virtual bool      Copy(const CJAVal &a)

   {

      m_key=a.m_key;

      CopyData(a);

      return true;

   }

   virtual void      CopyData(const CJAVal &a)

   {

      m_type=a.m_type;

      m_bv=a.m_bv;

      m_iv=a.m_iv;

      m_dv=a.m_dv;

      m_sv=a.m_sv;

      CopyArr(a);

   }

   virtual void      CopyArr(const CJAVal &a)

   {

      int n=ArrayResize(m_e,ArraySize(a.m_e));

      for(int i=0; i<n; i++)

      {

         m_e[i]=a.m_e[i];

         m_e[i].m_parent=GetPointer(this);

      }

   }



public:

   CJAVal            m_e[];

   string            m_key;

   string            m_lkey;

   CJAVal            *m_parent;

   enJAType          m_type;

   bool              m_bv;

   long              m_iv;

   double            m_dv;

   string            m_sv;

   static int        code_page;



public:

                     CJAVal()

   {

      Clear();

   }

                     CJAVal(CJAVal *aparent,enJAType atype)

   {

      Clear();

      m_type=atype;

      m_parent=aparent;

   }

                     CJAVal(enJAType t,string a)

   {

      Clear();

      FromStr(t,a);

   }

                     CJAVal(const int a)

   {

      Clear();

      m_type=jtINT;

      m_iv=a;

      m_dv=(double)m_iv;

      m_sv=IntegerToString(m_iv);

      m_bv=m_iv!=0;

   }

                     CJAVal(const long a)

   {

      Clear();

      m_type=jtINT;

      m_iv=a;

      m_dv=(double)m_iv;

      m_sv=IntegerToString(m_iv);

      m_bv=m_iv!=0;

   }

                     CJAVal(const double a)

   {

      Clear();

      m_type=jtDBL;

      m_dv=a;

      m_iv=(long)m_dv;

      m_sv=DoubleToString(m_dv);

      m_bv=m_iv!=0;

   }

                     CJAVal(const bool a)

   {

      Clear();

      m_type=jtBOOL;

      m_bv=a;

      m_iv=m_bv;

      m_dv=m_bv;

      m_sv=IntegerToString(m_iv);

   }

                     CJAVal(const CJAVal &a)

   {

      Clear();

      Copy(a);

   }

                    ~CJAVal()

   {

      Clear();

   }



public:

   virtual bool      IsNumeric()

   {

      return m_type==jtDBL || m_type==jtINT;

   }

   virtual CJAVal    *FindKey(string akey)

   {

      for(int i=ArraySize(m_e)-1; i>=0; --i) if(m_e[i].m_key==akey) return GetPointer(m_e[i]);

      return NULL;

   }

   virtual CJAVal    *HasKey(string akey,enJAType atype=jtUNDEF);

   virtual CJAVal   *operator[](string akey);

   virtual CJAVal   *operator[](int i);

   void              operator=(const CJAVal &a)

   {

      Copy(a);

   }

   void              operator=(const int a)

   {

      m_type=jtINT;

      m_iv=a;

      m_dv=(double)m_iv;

      m_bv=m_iv!=0;

   }

   void              operator=(const long a)

   {

      m_type=jtINT;

      m_iv=a;

      m_dv=(double)m_iv;

      m_bv=m_iv!=0;

   }

   void              operator=(const double a)

   {

      m_type=jtDBL;

      m_dv=a;

      m_iv=(long)m_dv;

      m_bv=m_iv!=0;

   }

   void              operator=(const bool a)

   {

      m_type=jtBOOL;

      m_bv=a;

      m_iv=(long)m_bv;

      m_dv=(double)m_bv;

   }

   void              operator=(string a)

   {

      m_type=(a!=NULL)?jtSTR:jtNULL;

      m_sv=a;

      m_iv=StringToInteger(m_sv);

      m_dv=StringToDouble(m_sv);

      m_bv=a!=NULL;

   }



   bool              operator==(const int a)

   {

      return m_iv==a;

   }

   bool              operator==(const long a)

   {

      return m_iv==a;

   }

   bool              operator==(const double a)

   {

      return m_dv==a;

   }

   bool              operator==(const bool a)

   {

      return m_bv==a;

   }

   bool              operator==(string a)

   {

      return m_sv==a;

   }



   bool              operator!=(const int a)

   {

      return m_iv!=a;

   }

   bool              operator!=(const long a)

   {

      return m_iv!=a;

   }

   bool              operator!=(const double a)

   {

      return m_dv!=a;

   }

   bool              operator!=(const bool a)

   {

      return m_bv!=a;

   }

   bool              operator!=(string a)

   {

      return m_sv!=a;

   }



   long              ToInt() const

   {

      return m_iv;

   }

   double            ToDbl() const

   {

      return m_dv;

   }

   bool              ToBool() const

   {

      return m_bv;

   }

   string            ToStr()

   {

      return m_sv;

   }



   virtual void      FromStr(enJAType t,string a)

   {

      m_type=t;

      switch(m_type)

      {

      case jtBOOL:

         m_bv=(StringToInteger(a)!=0);

         m_iv=(long)m_bv;

         m_dv=(double)m_bv;

         m_sv=a;

         break;

      case jtINT:

         m_iv=StringToInteger(a);

         m_dv=(double)m_iv;

         m_sv=a;

         m_bv=m_iv!=0;

         break;

      case jtDBL:

         m_dv=StringToDouble(a);

         m_iv=(long)m_dv;

         m_sv=a;

         m_bv=m_iv!=0;

         break;

      case jtSTR:

         m_sv=Unescape(a);

         m_type=(m_sv!=NULL)?jtSTR:jtNULL;

         m_iv=StringToInteger(m_sv);

         m_dv=StringToDouble(m_sv);

         m_bv=m_sv!=NULL;

         break;

      }

   }

   virtual string    GetStr(char &js[],int i,int slen)

   {

#ifdef __MQL4__

      if(slen<=0) return "";

#endif

      char cc[];

      ArrayCopy(cc,js,0,i,slen);

      return CharArrayToString(cc, 0, WHOLE_ARRAY, CJAVal::code_page);

   }



   virtual void      Set(const CJAVal &a)

   {

      if(m_type==jtUNDEF) m_type=jtOBJ;

      CopyData(a);

   }

   virtual void      Set(const CJAVal &list[]);

   virtual CJAVal    *Add(const CJAVal &item)

   {

      if(m_type==jtUNDEF) m_type=jtARRAY; /*ASSERT(m_type==jtOBJ || m_type==jtARRAY);*/ return AddBase(item);

   }

   virtual CJAVal    *Add(const int a)

   {

      CJAVal item(a);

      return Add(item);

   }

   virtual CJAVal    *Add(const long a)

   {

      CJAVal item(a);

      return Add(item);

   }

   virtual CJAVal    *Add(const double a)

   {

      CJAVal item(a);

      return Add(item);

   }

   virtual CJAVal    *Add(const bool a)

   {

      CJAVal item(a);

      return Add(item);

   }

   virtual CJAVal    *Add(string a)

   {

      CJAVal item(jtSTR,a);

      return Add(item);

   }

   virtual CJAVal    *AddBase(const CJAVal &item)

   {

      int c=ArraySize(m_e);

      ArrayResize(m_e,c+1);

      m_e[c]=item;

      m_e[c].m_parent=GetPointer(this);

      return GetPointer(m_e[c]);

   }

   virtual CJAVal    *New()

   {

      if(m_type==jtUNDEF) m_type=jtARRAY; /*ASSERT(m_type==jtOBJ || m_type==jtARRAY);*/ return NewBase();

   }

   virtual CJAVal    *NewBase()

   {

      int c=ArraySize(m_e);

      ArrayResize(m_e,c+1);

      return GetPointer(m_e[c]);

   }



   virtual string    Escape(string a);

   virtual string    Unescape(string a);

public:

   virtual void      Serialize(string &js,bool bf=false,bool bcoma=false);

   virtual string    Serialize()

   {

      string js;

      Serialize(js);

      return js;

   }

   virtual bool      Deserialize(char &js[],int slen,int &i);

   virtual bool      ExtrStr(char &js[],int slen,int &i);

   virtual bool      Deserialize(string js,int acp=CP_ACP)

   {

      int i=0;

      Clear();

      CJAVal::code_page=acp;

      char arr[];

      int slen=StringToCharArray(js,arr,0,WHOLE_ARRAY,CJAVal::code_page);

      return Deserialize(arr,slen,i);

   }

   virtual bool      Deserialize(char &js[],int acp=CP_ACP)

   {

      int i=0;

      Clear();

      CJAVal::code_page=acp;

      return Deserialize(js,ArraySize(js),i);

   }

};



int CJAVal::code_page=CP_ACP;



//------------------------------------------------------------------ HasKey

CJAVal *CJAVal::HasKey(string akey,enJAType atype/*=jtUNDEF*/)

{

   for(int i=0; i<ArraySize(m_e); i++) if(m_e[i].m_key==akey)

      {

         if(atype==jtUNDEF || atype==m_e[i].m_type) return GetPointer(m_e[i]);

         break;

      }

   return NULL;

}

//------------------------------------------------------------------ operator[]

CJAVal *CJAVal::operator[](string akey)

{

   if(m_type==jtUNDEF) m_type=jtOBJ;

   CJAVal *v=FindKey(akey);

   if(v) return v;

   CJAVal b(GetPointer(this),jtUNDEF);

   b.m_key=akey;

   v=Add(b);

   return v;

}

//------------------------------------------------------------------ operator[]

CJAVal *CJAVal::operator[](int i)

{

   if(m_type==jtUNDEF) m_type=jtARRAY;

   while(i>=ArraySize(m_e))

   {

      CJAVal b(GetPointer(this),jtUNDEF);

      if(CheckPointer(Add(b))==POINTER_INVALID) return NULL;

   }

   return GetPointer(m_e[i]);

}

//------------------------------------------------------------------ Set

void CJAVal::Set(const CJAVal &list[])

{

   if(m_type==jtUNDEF) m_type=jtARRAY;

   int n=ArrayResize(m_e,ArraySize(list));

   for(int i=0; i<n; ++i)

   {

      m_e[i]=list[i];

      m_e[i].m_parent=GetPointer(this);

   }

}

//------------------------------------------------------------------ Serialize

void CJAVal::Serialize(string &js,bool bkey/*=false*/,bool coma/*=false*/)

{

   if(m_type==jtUNDEF) return;

   if(coma) js+=",";

   if(bkey) js+=StringFormat("\"%s\":", m_key);

   int _n=ArraySize(m_e);

   switch(m_type)

   {

   case jtNULL:

      js+="null";

      break;

   case jtBOOL:

      js+=(m_bv?"true":"false");

      break;

   case jtINT:

      js+=IntegerToString(m_iv);

      break;

   case jtDBL:

      js+=DoubleToString(m_dv);

      break;

   case jtSTR:

   {

      string ss=Escape(m_sv);

      if(StringLen(ss)>0) js+=StringFormat("\"%s\"",ss);

      else js+="null";

   }

   break;

   case jtARRAY:

      js+="[";

      for(int i=0; i<_n; i++) m_e[i].Serialize(js,false,i>0);

      js+="]";

      break;

   case jtOBJ:

      js+="{";

      for(int i=0; i<_n; i++) m_e[i].Serialize(js,true,i>0);

      js+="}";

      break;

   }

}

//------------------------------------------------------------------ Deserialize

bool CJAVal::Deserialize(char &js[],int slen,int &i)

{

   string num="0123456789+-.eE";

   int i0=i;

   for(; i<sle

Показано первые 50% кода (символов: 34925)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
3 492,50₽ ≈ $42.69