ライブラリ: JSONシリアライズとデシリアライズ(ネイティブMQL) - ページ 15

 

Artem Maltsev さん、私のバージョンを追加することをお勧めします。モジュールをダウンロードした人はそれができないでしょうから:.

if ((value = data["key1"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value[0]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value["key2"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value[0]) == NULL) {
  Print("value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value["key3"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}
 

二重丸の付け方を教えてください。


下にオプションがありますが、角括弧が追加されます。

      CJAVal js(NULL,jtUNDEF);
      double d = 0.05;
      js["OrderLot"].Add(d,2); //результат "OrderLot":[0.05].   

どうすればいいですか?

"OrderLot":0.05
 
Jsonサンプル


{
  "id": 54,
  "nome": "12.01 alterado",
  "condicoes": [
    {
      "id": 47,
      "estrategiaId": 54,
      "indicadorAId": 87,
      "indicadorA": {
        "id": 87,
        "nome": "iATR",
        "parametros": [
          {
            "id": 46,
            "nome": null,
            "valor": 10.0
          }
        ]
      },
      "retornoA": 0,
      "comparador": ">",
      "indicadorBId": 88,
      "indicadorB": {
        "id": 88,
        "nome": "iAMA",
        "parametros": [
          {
            "id": 47,
            "nome": "Aplicar a",
            "valor": 1.0
          },
          {
            "id": 48,
            "nome": "Periodo rapido",
            "valor": 2.0
          },
          {
            "id": 49,
            "nome": "Periodo lento",
            "valor": 3.0
          },
          {
            "id": 50,
            "nome": "Deslocalmento",
            "valor": 4.0
          },
          {
            "id": 51,
            "nome": "Aplicar a",
            "valor": 0.0
          }
        ]
      },
      "retornoB": 0
    },
    {
      "id": 48,
      "estrategiaId": 54,
      "indicadorAId": 90,
      "indicadorA": {
        "id": 90,
        "nome": "iATR",
        "parametros": [
          {
            "id": 52,
            "nome": null,
            "valor": 10.0
          }
        ]
      },
      "retornoA": 0,
      "comparador": ">",
      "indicadorBId": 89,
      "indicadorB": {
        "id": 89,
        "nome": "iAMA",
        "parametros": [
          {
            "id": 53,
            "nome": "Aplicar a",
            "valor": 1.0
          },
          {
            "id": 54,
            "nome": "Periodo rapido",
            "valor": 2.0
          },
          {
            "id": 55,
            "nome": "Periodo lento",
            "valor": 3.0
          },
          {
            "id": 56,
            "nome": "Deslocalmento",
            "valor": 4.0
          },
          {
            "id": 57,
            "nome": "Aplicar a",
            "valor": 0.0
          }
        ]
      },
      "retornoB": 0
    }
  ]
}


"condicoes "というキーの配列を取得したい。
"condicoes":[ { "id": 47, ... } , { "id": 48, ... } ]。

私のコード mql

   string pJS=" ... " // Jsonサンプル
   js.Deserialize(pJS);
   Print(js["nome"].ToStr()); // 12.01分身
   Print(js["condicoes"].m_type); // タイプ6またはjtARRAYが正しい。
   Print(js["condicoes"].Size()); //...1を返すが、2が正しい

私を助けることができますか?

タンク

 
Andre Luiz Medeiros Peixoto #:
Jsonサンプル




"condicoes "というキーの配列を取得したい
"condicoes":[ { "id": 47, ... } , { "id": 48, ... } ]。

私のコード mql


助けてくれますか?

戦車

私のパソコンでは正常に動作しています。pJS変数にjson文字列をどのように入れるのですか?

 

Artem Maltsev このJSONライブラリを作ってくれてありがとう。C++ ライブラリをベースにしているのですか?

パフォーマンスベンチマークはありますか?また、データの保存には内部的に1バイトまたは2バイトの文字を使用するのですか?

 

値がNULL の 場合、 Deserialize() は型を jtNULL に設定しますが、m_sv には NULL を代入しないため、ToStr() メソッドが NULL と比較されると false を返します:

#include <JAson.mqh>
//+------------------------------------------------------------------+
//| スクリプト・プログラム開始機能|
//+------------------------------------------------------------------+
void OnStart()
{
   string serialized="{\"a\":1,\"b\":null}";
   CJAVal json;
   json.Deserialize(serialized);
   if(json["b"].ToStr()==NULL)
   {
      Alert("b is NULL");
   }
   else if(json["b"].ToStr()=="")
   {
      Alert("b is an empty string");
   }
   else
   {
      Alert("b is ", json["b"].ToStr());
   }
}

と出力される:

2022.03.28 17:50:02.833 test-jsonNULLComparison (GBPUSD,M30) 警告: b は空の文字列です。

回避策としては、値の型を jtNULL と比較するか、220 行目のソースコードに "m_sv=NULL;" を追加して変更します:

if (i+3<slen) if (StringCompare(GetStr(js, i, 4), "null", false)==0) { m_sv=NULL; i+=3; return true; }
 

こんにちは!

クールなライブラリーにとても助けられています。

文字列から部分文字列を抽出する方法です:

以下の文字列があります。

{"type": "settings", "data":{"auto_trade":true, "stop_trade":true}} という文字列があります。}

データの部分文字列を取り出す必要があります。

そのように動作しません:

CJAVal js;

js.Deserialise(stroka);

js["data"].ToStr();

 
Ruslan Piraliyev #:

こんにちは!

クールなライブラリーはとても役に立ちます。

文字列から部分文字列を抽出する方法です:

文字列

{"type": "settings", "data":{"auto_trade":true, "stop_trade":true}} という文字列があります。

データの部分文字列を取り出す必要があります。

そのように動作しません:

CJAVal js;

js.Deserialize(stroka);

js["data"].ToStr();

必要な部分文字列を取り出す方法は、今のところ1つしか見つかっていない:

js.Deserialize(stroka);

string data2=js["data"].Serialize();

js2.Deserialise(data2);

つまり、必要な部分文字列は、シリアライズとデシリアライズを別々に行う必要があります。

 
Sergey Likho #:

二重丸の付け方を教えてください。

以下のような方法がありますが、角括弧が追加されます。

どうすればよいのでしょうか?

次のようにしてください:

      CJAVal js(NULL,jtUNDEF);
      double d = 0.05;
      js["OrderLot"] = d;
 

残念ながら、また何かがうまくいかなかった。

うまくいかないコードからどうやって学べというのか?

#include <JAson.mqh>
 CJAVal jv;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
 
   string user = "Test User";
   string account="testuser mail";
   string EA="010000";
   bool reply=false;

   jv["user"]=user;
   jv["account"]=account;
   jv["itemnumber"]=EA;

   char data[];
   ArrayResize(data, StringToCharArray(jv.Serialize(), data, 0, WHOLE_ARRAY)-1);

//--- データの送信
   char res_data[];
   string res_headers=NULL;
   int r=WebRequest("POST", "meine adresse", "Content-Type: text/plain\r\n", 5000, data, res_data, res_headers);
//ArrayPrint(data);

//--- レスポンスから{"reply": "true"}を取り出すとしよう。
//--- AccessToken
   jv.Deserialize(res_data);
   string replyasstrinng=jv["isValid"].ToStr();
   Print("reply as string: ",replyasstrinng);
}

GETとPOSTで試してみた。

"meine adresse"

はもちろん、レスポンスが次のように表示されるページのURLです。

{"isValid":true}と表示されます。

あるいは

{"isValid":false}となります。

をレスポンスとして返します。

しかし

  Print("reply as string: ",replyasstrinng);

を使用すると、まったく何もしない。

その理由は何ですか?