ライブラリ: JSONシリアライズとデシリアライズ(ネイティブ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);

「構造 体をパーサーのデータで 満たす。- どうやるんですか?(構造体を記述する必要はありません))

ss私が言ったのは単純な構造のことで、オブジェクト指向のものではありません。

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

しかし......。分解してタイミングを収集するのは完璧なんだけど、データが取得できない......。デーブルやintsなどはダメなのかな?- 文字列は文字列のままにしておいて、この文字列を外部からどう扱うかを決める。

 
Andrey Dik:

しかし......。用語の分解と組み立てはいいけど、データが取れない...。デーブルや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:

配列の中に配列があるので、別のループレベルを追加する必要がある。

ソーサリー、82レベル。

もっとシンプルにできないのか?

 
Andrey Dik:

魔術・82レベル

もっとシンプルにできないのか?

アレイをこんなに深くしたのはあなたたちでしょ。