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

[Удален]  

Эта библиотека вызывает ОШИБКУ, и я это подтвердил

ERR_WRONG_STRING_PARAMETER
 
5040
 
Damaged parameter of string type
 

мой код

CJAVal  jv;
string text="abc";

jv.Deserialize(text);

Есть идеи, как это исправить?

Это происходит только тогда, когда я деарилизирую любую строку

 

Если строковое значение содержит символ ';', то десериализовать не удастся!

array out of range in 'JAson.mqh' (205,13)

 
Dmitry Zhakov

Все работает. Я нашел проблему на своей стороне.

 
Чем вы . Я отправляю POST WebRequests (http) из MT5 (MQL5) в Chat GPT-4-o-mini API (openai.com). OpenAI получает JSON данные. MQL не поддерживает JSON. Поэтому пришлось преобразовать строку в строку, затем преобразовать строку в массив Char[], чтобы вставить в WebRequest в качестве postData. Я использую вашу библиотеку, я дам вам знать, как я справляюсь.
 
Philip Kym Sang Nelson #:
Чем вы . Я отправляю POST WebRequests (http) из MT5 (MQL5) в Chat GPT-4-o-mini API (openai.com) . OpenAI получает данные в формате JSON . MQL не поддерживает JSON. Поэтому пришлось преобразовать строку в строку, затем преобразовать строку в массив Char[], чтобы вставить как postData в WebRequest. Я использую вашу библиотеку, я дам вам знать, как у меня дела.

Это потрясающе
Я думал о том же, чтобы кормить мой ML ответами из ChatGPT.
Не могли бы вы поделиться, как вы это сделали? С какими трудностями столкнулись?

Спасибо!

 
Все работает отлично Kudos :) Вы пойдете и проверите мой пост о том, как использовать класс CJVAL для разбора json-данных Извлечение определенных данных из JSON-ответов в MetaTrader 5
Trading blogs and financial markets analysis
Trading blogs and financial markets analysis
  • www.mql5.com
Read blogs to find the latest news on various topics from all over the world — rumors about companies, country and industry reports, market analysis, latest developments in speculative trading and more. Start your own blog to share new ideas and trading achievements with the members of MQL5.community. Post interesting images and videos, enjoy unlimited possibilities!
 

Здравствуйте, есть ли способ:

- Установить значение ключа в null

- Установить значение ключа в {} (пустой объект).

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

Спасибо за любой ответ

 

Что я делаю не так?
Реальный пример из практики. Строка длиной 21+ тыс символов. Несколько переменных и 2 больших массива b и a. В каждом по 500 подмассивов по 2 элемента:

"b":[["0.0018659","8500"],["0.0018655","16800"],...],
"a":[["0.0018659","8500"],["0.0018655","16800"],...],


Обнаружил несоответствие исходных данных и тех которые выдает JASON:

["0.0019640","800"],["0.0019641","91500"],["0.0019644","96600"],["0.0019645","503900"],["0.0019646","101600"],
["0.0019649","500"],["0.0019650","300"],["0.0019651","1200"],["0.0019652","500"],["0.0019653","800"]],
n=2000
[ 0]      0.0018659,  8500.0000000,     0.0018655, 16800.0000000,     0.0018654,153000.0000000,     0.0018653,  3800.0000000,     0.0018650,   300.0000000
[10]      0.0018649,   900.0000000,     0.0018647,  2900.0000000,     0.0018645,  6700.0000000,     0.0018644, 33700.0000000,     0.0018640,  9600.0000000
[ 0]     0.0019640,  200.0000000,    0.0019641,25600.0000000,    0.0019644, 3000.0000000,    0.0019645, 3800.0000000,    0.0019646,  200.0000000
[10]     0.0019649, 3600.0000000,    0.0019650,  700.0000000,    0.0019651,  200.0000000,    0.0019652,  700.0000000,    0.0019653,  100.0000000

в первых 2-х строках выведен конец исходной строки, которая парсится JASON-ом.
При парсинге все элементы записываются в массив. Получено n=2000 элементов. Это правильно.
Потом 2 строки - это первые 20 элементов массива и ещё 2 строки последних 20 элементов.
В начале массива всё совпадает.
Но в конце первая цифра из пар совпадает, а вторая нет.  Видимо взяло откуда то еще.

Проверил. Во второй массив a, попали данные из первого массива b. Вот концовка исходных данных массива а:

,["0.0017785","200"],["0.0017784","3600"],["0.0017783","700"],["0.0017782","200"],["0.0017781","700"],["0.0017780","100"]],

Т.е. второй массив в подмассивах в первых элементах содержит свое /правильное значение, во вторых элементах - значения из первого массива.
Проблема видимо в коде парсера.

Очень напрягает подмена данных - как на них потом тестировать? Только неправильно! Повезло, что заметил. Надеюсь для более простых вариантов без вложенных массивов работает правильно. Но надо все проверять, прежде чем пускать в работу.

Код, на основе примеров из ветки, только с моей строкой данных:

 void TestJAson(string msg) {
   CJAVal json; 
   json.Deserialize(msg);
   double bin[];int n=0;
   int s=ArraySize(json["data"]["b"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["b"][i][0].ToDbl(); n++;//price
      bin[n]=json["data"]["b"][i][1].ToDbl();; n++;//volume
   }

   s=ArraySize(json["data"]["a"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["a"][i][0].ToDbl(); n++;//price
      bin[n]=json["data"]["b"][i][1].ToDbl(); n++;//volume
   }
   
   Print(StringSubstr(msg,StringLen(msg)-300,300));
   
   int tot=ArraySize(bin);
   Print("n=",tot);
   ArrayPrint(bin,7,",",0,20);
   ArrayPrint(bin,7,",",tot-20,20);
}

void OnStart(){
   ulong from=GetMicrosecondCount();
   TestJAson(message);
   ulong to=GetMicrosecondCount();
   PrintFormat("MQL %lu mcs/iteration",(to-from));
}

Полный код скрипта с этой строкой приложен.
Библиотека песледней версии "1.13" - скачал с ГитХаба

Файлы:
3.mq5  53 kb
 

Выше тоже пишут про проблемы со вторым элементом. Видимо та же проблема.

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

Минус- под каждый шаблон придется тратить время и писать свой парсер и считать номера элементов...
Плюс - в 3 раза быстрее универсального и удобного JASON. Вместо 40 секунд 13 на исходных данных ~400 Mb.

Пол дня потратил на это.
Точнее на 3 версии:
1) сначала в char массиве искал конкретные подстроки и потом собирал строки из их значений, - предполагал, что это будет самый быстрый код
Хотел работать напрямую с char массивом, т.к. он у меня исходный из WebRequest или FileOpen и не хотел его собирать в большую строку для скорости.
2) потом из char[] создавал строки только с массивами b и а - и сплитовал
3) и наконец самый простой код - каждую строку собирал в одну большую текстовую строку (со всеми данными в т.ч. лишними) и ее сплитовал

Оказалось, что все 3 варианта примерно одинаковы по скорости. Поэтому остановился на самом простом - 3-м варианте. Его будет потом проще переделывать к другим шаблонам с другими данными.

Почему то думал, что работа с char  массивом будет быстрее, чем его сборка в строку и разделение на строковый массив через ". Видимо split хорошо оптимизирован по скорости.

Хорошо бы, если бы разработчики MQ добавили в язык какой-нибудь из стандартных парсеров JSON. JASON не все варианты правильно парсит и судя по всему разработчик уже тут не бывает и надежды на исправление нет.
 
Forester #:
Библиотека песледней версии "1.13" - скачал с ГитХаба

Там переписанный форк кода с этого топика (1.12). С оригиналом не проверяли?

PS: У меня есть 1.12 оригинальный и сильно исправленный. Не помню, откуда исправления, скорее всего с этой ветки.