程序库: 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 等),可以通过循环或递归调用,这并不重要....。我不知道如何获取一对货币对的第一个和下一个名称...我不知道如何获取一对货币对的第一个和下一个名称....

 
Delta.800:

交易所给出的答复是....(交易对的数量可以不同....。例如,如果交易所将关闭或增加某些配对)。

我需要以某种方式通过循环或递归调用获取响应中所有货币对的名称(btc_usd、btc_rur、btc_eur 等),这并不重要....。我不知道如何获取一对货币对的第一个和下一个名称...我不知道如何获取一对字符串的首名和次名......我想不通....

剪切开头的字符串

{
  "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;
        }
};
我想这里也有类似的东西,但我想不出来。(我还不擅长 OOP......)。
 
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

然而.....可以完美地拆解和收集时序,但我无法获取数据....也许没有 dables、ints 等?- 因此,我建议您先以字符串的形式保留字符串,然后再决定如何从外部处理该字符串。

 
Andrey Dik:

然而.....Disassembles and assembles(拆卸和组装)这一术语很好,但我无法获取数据....。也许我们不需要 dables、ints 等?- 让字符串以字符串的形式存在,然后再决定如何从外部处理这个字符串。

您在数组中使用了一个数组。这意味着您需要增加一个 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 级

你就不能再简单点吗? - 什么意思?

是你们把阵列弄得这么深的