Библиотеки: JSON Serialization and Deserialization (native MQL) - страница 6

 
JAval ja, je, js;

je["symbol"]="USDJPY"; je["period"]=5; ja.Add(je);
je["symbol"]="AUDUSD"; je["period"]=5; ja.Add(je);
je["symbol"]="EURUSD"; je["period"]=5; ja.Add(je);

js["keyboard"].Add(ja);

ja.Clear();
je["symbol"]="GBPUSD"; je["period"]=5; ja.Add(je);
je["symbol"]="NZDUSD"; je["period"]=5; ja.Add(je);
je["symbol"]="EURJPY"; je["period"]=5; ja.Add(je);

js["keyboard"].Add(ja);


вам действительно непонятно или просто лень кодить самому? )

 
o_o:


вам действительно непонятно или просто лень кодить самому? )


Нет, Алексей, мне не лень кодить. Суть в другом: во всех Ваших примерах фиксированное количество заданных элементов массива. Вот мой код, который к сожалению не работает. В чем ошибка, понять не могу. (((

   CJAVal j_keyboard; // Основной массив
   CJAVal j_array;    // Вложенный массив  
   CJAVal j_item;     // Элемент массива  

   //--- Определяем количество переданных элементов
   int count = ArraySize(array_value);
   if(count == 0) return(j_keyboard.Serialize()); // Нет элементов

   int col = 0;
   for(int item = 0; item<count; item++)
      {
         //--- Заполняем простейший элемент
         j_item["text"] = array_value[item];
         
         if(col<columns) // Если количество меньше заданных колонок, добавляем в массив
            {
               j_array.Add(j_item);
            }
         else
            {   
               
               // Достигли заданного количества колонок, добавлем их в основной массив
               j_keyboard["keyboard"].Add(j_array);
               col = 0;
               j_array.Clear(); // Очищаем вложенный массив
            }
      }
   
   Print(j_keyboard.Serialize());
array_value - Это строчный массив переданных элементов
 
Алексей Барбашин:

Вот мой код, который к сожалению не работает.

как поняли, что он не работает?

 
o_o:

как поняли что не работает?


Строка сериализации выводит пустой объект. Сейчас срипт накидаю и скину сюда. 

.... спустя некоторое время...

Алексей, простите, это я лоханулся... не добавил увеличение итератора... (((

Все работает. Вот что значит просто пообщаться с умным человеком! ))) Спасибо еще раз за Вашу разработку, которой я пользуюсь уже почти год!

Файлы:
 
Алексей Барбашин:

Строка сериализации выводит пустой объект. Сейчас срипт накидаю и скину сюда.

у меня работает

#include <JAson.mqh>
//------------------------------------------------------------------    OnStart
void OnStart()
{
        string array_value[]={"000", "111", "012", "AAA", "BBB", "ABC"};
        Print(Get(array_value, 3));
}
//------------------------------------------------------------------    Get
string Get(string& array_value[], int columns)
{       
        CJAVal jk; // Основной массив
        int n=ArraySize(array_value); if (n==0) return jk.Serialize(); // Нет элементов
        
        CJAVal ja;    // Вложенный массив  
        for(int i=0, c=0; i<n; i++, c++)
        {
                if (c>=columns) { jk["keyboard"].Add(ja); c=0; ja.Clear(); }
                CJAVal ji; ji["text"]=array_value[i]; ja.Add(ji); // добавляем
        }
        if (ArraySize(ja.m_e)>0) jk["keyboard"].Add(ja);
        
        return jk.Serialize();
}

{"keyboard":[[{"text":"000"},{"text":"111"},{"text":"012"}],[{"text":"AAA"},{"text":"BBB"},{"text":"ABC"}]]}


а что с вашим кодом не так?

 
o_o:

у меня работает


а что с вашим кодом не так?


Ответил выше. нашел свою ошибку. Спасибо! )))

 

Алексей Барбашин:

Все работает. Вот что значит просто пообщаться с умным человеком! )))

есть же дебаг для всего. он намного умнее )

Спасибо еще раз за Вашу разработку, которой я пользуюсь уже почти год!

пожалуйста

 
o_o:

Библиотека работает в MQL4 и MQL5

Благодарность принимается в виде примеров вашей практической работы с веб-ресурсами из MQL.  ;)


Добрый день! 

Спасибо за библиотеку!

Применил вашу библиотеку для мониторинга работы компьютеров, подключенных к пулу для майнинга криптовалют.

Пул (это сайт) в ответ на запрос о состоянии выдает ответ в виде: 

/*

{"status":"OK",

"data":[

{"worker":"riga1","lastSeen":1511432055,"currentHashrate":2746.6666666666665,"validShares":103,"invalidShares":0,"staleShares":null},

{"worker":"riga2","lastSeen":1511432068,"currentHashrate":3040,"validShares":114,"invalidShares":1,"staleShares":null},

{"worker":"riga3","lastSeen":1511432057,"currentHashrate":2426.6666666666665,"validShares":91,"invalidShares":0,"staleShares":null},

{"worker":"riga4","lastSeen":1511432055,"currentHashrate":2266.6666666666665,"validShares":85,"invalidShares":0,"staleShares":null},

{"worker":"riga5","lastSeen":1511432061,"currentHashrate":2666.6666666666665,"validShares":100,"invalidShares":0,"staleShares":null},

{"worker":"riga6","lastSeen":1511432050,"currentHashrate":2293.3333333333335,"validShares":86,"invalidShares":0,"staleShares":null},

{"worker":"riga7","lastSeen":1511432069,"currentHashrate":1013.3333333333334,"validShares":38,"invalidShares":0,"staleShares":null}]}

*/

riga1, riga2  и т.д. - это компьютеры, необходимо промониторить, чтобы их "currentHashrate" не падал ниже порогового значения.

код получился очень простой : 

void Fly_API_Monitor()
{

int res=0; string url;  string cook=""; string ref=""; string res_header=""; 
char result[]; 
char data[];
string strRes="";
// Тут вписывается свой кошелек
string wallet="t1L8S ............";
ResetLastError();
url="https://api-zcash.flypool.org/miner/" + wallet + "/workers/monitor"; 
res=WebRequest("GET", url, cook, ref, 5000, data,0, result, res_header);
strRes=CharArrayToString(result,CP_ACP);
if (res !=-1)
{
//Print("Ошибки нет");
//Print(strRes);
CJAVal dataM;
dataM.Deserialize(strRes);
string stat=dataM["status"].ToStr();
int i=0;
for(i=0; i< ArraySize(dataM["data"].m_e); i++) 
{ 
Print(dataM["data"].m_e[i]["worker"].ToStr()+" Хешрейт: "+ dataM["data"].m_e[i]["currentHashrate"].ToStr());
}
}
else 
{
Print("Ошибка "+IntegerToString(GetLastError()));
Print(strRes);
}
}

выдает типа: 

riga7 Хешрейт: 826.6666

riga6 Хешрейт: 2293.333

riga5 Хешрейт: 3200

riga4 Хешрейт: 1866.666

riga3 Хешрейт: 2800

riga2 Хешрейт: 2853.333

riga1 Хешрейт: 2933.333


 

Разработчикам библиотеки огромное спасибо, но она работала очень медленно, обычно перед тем как выкладывать какой либо продукт или код, его необходимо профилировать, но в данном варианте так как библиотека бесплатная, тут грех жаловаться, по итогу библиотека работает очень медленно, если не сделать вот этого:

было:

        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* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1); return GetPointer(m_e[c]); } // добавление

стало:

        virtual CJAVal* AddBase(const CJAVal &item) { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); m_e[c]=item; m_e[c].m_parent=GetPointer(this); return GetPointer(m_e[c]); } // добавление
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); return GetPointer(m_e[c]); } // добавление

Иначе вот что было до (сам Web запрос на данном скрине занял по времени 16 718 439, все остальное обработка):

и после доработки (стрелкой показан тот же Web запрос):

Ускорение получили почти в 20 раз.

 
Daniil Kurmyshev:

почему 50000 ?

не 2000000 или не 100?

--

на каких тестовых данных проверяли?

Причина обращения: