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

 
Andrey Dik:

Хорошая работа, респект!

Однако... если попадают для десериализации битые данные (количество открывающих не равно закрывающим ковычкам или скобкам), то программа рушится с сообщением о выходе за пределы массива. А это очень не хорошо, обязаны быть учтены подобные моменты в работе с массивами хотя бы, если нет проверки на корректность входных данных.

Конкретные данные продемонстрируйте
 
o_o:


покажите ваш код, на котором остановились, что именно у вас не получается

Вобщем я даже ума не приложу как можно получить названия всех пар из первой ссылки :-(

---

из первой ссылки доступ к параметрам пары, я получаю так:

CJAVal dataM;
dataM.Deserialize(ttt);  
... 
Print(dataM["pairs"]["btc_usd"]["fee"].ToDbl());

где ttt - это строка полученная от веб запроса.

из второй ссылки, я решил задачу, доступ получаю так:

Print(dataM["btc_usd"]["asks"].m_e[1][0].ToDbl());
где
m_e[X][Y]

X- номер ордера (начиная с нулевого)

Y- 0- это цена, 1- это стоимость .

 
Delta.800:

Вобщем я даже ума не приложу как можно получить названия всех пар из первой ссылки :-(

---

из первой ссылки доступ к параметрам пары, я получаю так:

где ttt - это строка полученная от веб запроса.

из второй ссылки, я решил задачу, доступ получаю так:

где

X- номер ордера (начиная с нулевого)

Y- 0- это цена, 1- это стоимость .

ну и ок.

если сейчас это решает вашу задачу - пользуйтесь этим решением.

будет не хватать, придумаете что то лучшее.

 
o_o:

ну и ок.

если сейчас это решает вашу задачу - пользуйтесь этим решением.

будет не хватать, придумаете что то лучшее.

нет, нет Вы немного неправильно поняли...

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

 
Да, вероятно я не понял что у вас за проблема, по показанным вами строкам вы все смогли получить. 
 
o_o:
Конкретные данные продемонстрируйте

  //---
  in = "{\"asdasdasd\":{\"sdfs\":0.02189746,\"dfgdf\":0.01925917}}}}";
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  //---
  in = "{\"asdasdasd\":{\"sdfs\":0.02189746,\"dfgdf\":0.01925917}}}";
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  //---
  in = "{\"asdasdasd\":{\"sdfs\":0.02189746,\"dfgdf\":0.01925917}}";
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  //---
  in = "{\"asdasdasd\":{\"sdfs\":0.02189746,\"dfgdf\":0.01925917}";
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  //---
  in = "{\"asdasdasd\":{\"sdfs\":0.02189746,\"dfgdf\":0.01925917";
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);


2018.02.21 14:03:39.861    jason_test (EURUSD,W1)    {"asdasdasd":{"sdfs":0.02189746,"dfgdf":0.01925917}}
2018.02.21 14:03:39.861    jason_test (EURUSD,W1)    {"asdasdasd":{"sdfs":0.02189746,"dfgdf":0.01925917}}
2018.02.21 14:03:39.861    jason_test (EURUSD,W1)    {"asdasdasd":{"sdfs":0.02189746,"dfgdf":0.01925917}}
2018.02.21 14:03:39.861    jason_test (EURUSD,W1)    {"asdasdasd":{"sdfs":0.02189746,"dfgdf":0.01925917}}
2018.02.21 14:03:39.862    jason_test (EURUSD,W1)    array out of range in 'json.mqh' (597,19)

 

пофиксил

1.13

Файлы:
JAson.mqh  31 kb
 
o_o:
Да, вероятно я не понял что у вас за проблема, по показанным вами строкам вы все смогли получить. 
{
  "server_time": 1519120845,
  "pairs": {
    "btc_usd": {
      "decimal_places": 3,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_rur": {
      ...
    },
    "btc_eur": {
      ...

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

мне нужно как-то получить все названия пар, в ответе (btc_usd, btc_rur, btc_eur и т.д.) в цикле или через рекурсивный вызов, не важно... я не могу понять, как получить первое и следующее название пары... вроде как-то через m_key, но вот как, немогу сообразить...

 
Delta.800:

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

мне нужно как-то получить все названия пар, в ответе (btc_usd, btc_rur, btc_eur и т.д.) в цикле или через рекурсивный вызов, не важно... я не могу понять, как получить первое и следующее название пары... вроде как-то через m_key, но вот как, немогу сообразить...

Обрежьте строку в самом начале

{
  "server_time": 1519120845,
  "pairs": 

Потом удалите в конце строки }

Потом скормите строку в парсер.

Заполните свою структуру данными парсера. А далее делайте что хотите со своей структурой - названия пар и т.д.

 
Andrey Dik:

Обрежьте строку в самом начале

Потом удалите в конце строки }

Потом скормите строку в парсер.

Заполните свою структуру данными парсера. А далее делайте что хотите со своей структурой - названия пар и т.д.

"Потом скормите строку в парсер." - это так?  dataM.Deserialize(ttt);

"Заполните свою структуру данными парсера." - а как это сделать? чиркните строчку плиз... (структуру описывать не нужно))

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

struct bpInfo
{
public:
        ulong server_time;
        bpPairInfo pairs[];
        
        bool FromJson(CJAVal& ja)
        {
                server_time=(uint)ja["server_time"].ToInt();
                CJAVal* jp=ja["pairs"];
                int n=ArrayResize(pairs, ArraySize(jp.m_e));
                for (int i=0; i<n; ++i) pairs[i].FromJson(jp.m_e[i]);
                return true;
        }
};
вроде сдесь что-то похожее, но разобраться не могу. (я не силен в ООП, пока...)
Причина обращения: