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

 

пофиксил

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;
        }
};
вроде сдесь что-то похожее, но разобраться не могу. (я не силен в ООП, пока...)
 
o_o:

пофиксил

1.13

Попробуйте такой пример:

#include "JAson.mqh"

//+------------------------------------------------------------------+
void OnStart ()
{
  string in, out;
  CJAVal js (NULL, jtUNDEF);
  bool b;

  //---
  in =  "{\"фирма1\":{\"модельный_ряд1\":[[0.1,1.3],[0.2,1.5],[0.3,2.0]],\"модельный_ряд2\":[[0.1,2.3],[0.2,2.5],[0.3,3.0]]},\"фирма2\":{\"модельный_ряд1\":[[0.2,3.8],[0.3,4.0],[0.4,4.5]],\"модельный_ряд2\":[[0.2,4.8],[0.3,5.0],[0.4,6.5]]}}}";
  Print(in);
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  for (int i = 0; i < ArraySize (js.m_e); i++)
  {
    Print("---");
    Print(js.m_e[i].m_key);
    
    for (int i1 = 0; i1 < ArraySize (js.m_e [i].m_e); i1++)
    {
      Print("   : ", js.m_e[i].m_e[i1].m_key);
      
      for (int i2 = 0; i2 < ArraySize (js.m_e [i].m_e [i1]. m_e); i2++)
      {
        Print("      : ", js.m_e[i].m_e[i1].m_e[i2].m_key, " :", js.m_e[i].m_e[i1].m_e[i2].ToDbl());
      }
    }
  }
}
//+------------------------------------------------------------------+
 
Delta.800:

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

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

Посмотрите в моём примере про фирмы и модельный ряд - там показано как получить данные из парсера....


o_o:

пофиксил

1.13

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

 
Andrey Dik:

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

у вас же массив в массиве. значит надо еще уровень цикла добавить i3

модельный_ряд1 :[ [0.1,1.3], [0.2,1.5], [0.3,2.0] ]
#include <JAson.mqh>

//+------------------------------------------------------------------+
void OnStart ()
{
  string in, out;
  CJAVal js (NULL, jtUNDEF);
  bool b;

  //---
  in =  "{\"фирма1\":{\"модельный_ряд1\":[[0.1,1.3],[0.2,1.5],[0.3,2.0]],\"модельный_ряд2\":[[0.1,2.3],[0.2,2.5],[0.3,3.0]]},\"фирма2\":{\"модельный_ряд1\":[[0.2,3.8],[0.3,4.0],[0.4,4.5]],\"модельный_ряд2\":[[0.2,4.8],[0.3,5.0],[0.4,6.5]]}}}";
  Print(in);
  out = "";
  b = js.Deserialize (in);
  js.Serialize (out);
  Print (out);
  
  for (int i = 0; i < ArraySize (js.m_e); i++)
  {
    Print("---");
    Print(js.m_e[i].m_key);
    
    for (int i1 = 0; i1 < ArraySize (js.m_e [i].m_e); i1++)
    {
      CJAVal* j1=GetPointer(js.m_e[i].m_e[i1]);
      Print("   : ", j1.m_key);
      
      for (int i2 = 0; i2 < ArraySize (j1. m_e); i2++)
      {
        CJAVal* j2=GetPointer(j1.m_e[i2]);
        for (int i3 = 0; i3 < ArraySize (j2. m_e); i3++)
        {
           CJAVal* j3=GetPointer(j2.m_e[i3]);
           Print("         : ", j3.m_key, " :", j3.ToDbl());
        }
      }
    }
  }
}
 

ОГРОМНОЕ СПАСИБО, всем откликнувшимся!!!

{
  "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": {
      ...

получаем названия пар:

CJAVal dataM;
...
dataM.Deserialize(ttt);   
Print(dataM.m_e[0].m_key);
Print(dataM.m_e[1].m_key);
for (int i1 = 0; i1 < ArraySize (dataM.m_e [1].m_e); i1++)
  {
    CJAVal* j1=GetPointer(dataM.m_e[1].m_e[i1]);
    Print("   :-", j1.m_key);
  }

в итоге:

server_time
pairs
:-btc_usd
:-btc_rur
:-btc_eur
:-ltc_btc
...

то, что требовалось!

 
o_o:

у вас же массив в массиве. значит надо еще уровень цикла добавить i3

колдунство, 82 левл.

а попроще никак нельзе?

 
Andrey Dik:

колдунство, 82 левл.

а попроще никак нельзе?

в смысле?  сами же такие глубины массивов сделали.