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

 

ライブラリーはとても便利です。しかし、double型の値をシリアライズする際に、精度が 大きく損なわれることに遭遇しました。

double minutes_open[] = {0.95347, 0.95317, 0.95324}.

for (int i=0; i<ArraySize(minutes_open); ++i) jv["minutes_open"].Add(minutes_open[i]);

シリアライズ後、次のようになる:

"minutes_open":[9.53e-01,9.53e-01,9.53e-01]

つまり、最後の2つの有効文字が失われ、配列内のすべての値が互いに等しくなります。その結果、このデータに基づく計算はすべて無駄になってしまう......。

結局、配列の値を文字列に変換することで回避した。

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

こんにちは!

JAsonライブラリのドキュメントはこのサイトにはありません。より詳細なドキュメントを書き、ユニットテストを追加しました: https://github.com/vivazzi/JAson。誰かの役に立つかもしれません。

内部 Json (CJAVal オブジェクト) を使用する際のバグについて説明した issue を作成しました: https://github.com/vivazzi/JAson/issues/1.

CJAValオブジェクトが、オブジェクトとして別のCJAValオブジェクトに正しく割り当てられない:

CJAVal data;

// シンプルな構造
data["a"] = 12;

// 入れ子構造
CJAVal nested_data;
nested_data["k1"] = 7;
nested_data["k2"] = "baz";

data["b"] = nested_data;

Print(data["b"]["k1"].ToInt());  // 7ではなく0
Print(data["b"]["k2"].ToStr());  // "baz "の代わりに""
Print(data.Serialize());  // {"a":12,":{"k1":7, "k2": "baz"}, "b":{}} の代わりに {"a":12, "b":{"k1":7, "k2": "baz"}} とする。

回避策として、Set()メソッドを使用する必要があります:

data["b"].Set(nested_data);

Print(data["b"]["k1"].ToInt());  // 7
Print(data["b"]["k2"].ToStr());  // "baz"
Print(data.Serialize());  // {"a":12,"b":{"k1":7,"k2":"baz"}}

このバグは何年も前からあるものなので、どなたか助けていただけると、多くのMQL開発者に感謝します。

 

みなさん、こんにちは!

JAsonのドキュメントはこのサイトでは完全ではないので、より詳細なドキュメントhttps://github.com/vivazzi/JAson/ を書き、ユニットテストを追加しました。

そして、ネストされた Json (CJAVal オブジェクト) を使用する際の問題を説明しました: https://github.com/vivazzi/JAson/issues/1.

CJAValオブジェクトは、"="記号を使用すると正しく保存されません(空のキーが保存されます):

CJAVal data;

// シンプルな構造
data["a"] = 12;

// 入れ子構造
CJAVal nested_data;
nested_data["k1"] = 7;
nested_data["k2"] = "baz";

data["b"] = nested_data;

Print(data["b"]["k1"].ToInt());  // 7ではなく0
Print(data["b"]["k2"].ToStr());  // "baz "の代わりに""
Print(data.Serialize());  // {"a":12,": {"k1":7, "k2": "baz"}, "b":{}} の代わりに {"a":12, "b":{"k1":7, "k2": "baz"}} とする。

はい、このサイトのライブラリ・ページに添付されているテストでは、Set() メソッドを使う必要があることがわかります:

data["b"].Set(nested_data);

Print(data["b"]["k1"].ToInt());  // 7
Print(data["b"]["k2"].ToStr());  // "baz"
Print(data.Serialize());  // {"a":12,"b":{"k1":7,"k2":"baz"}}

しかし、もし誰かがライブラリを修正して、"="記号を使ってネストしたJson構造を保存できるようにしてくれれば、多くの人が助かるだろう。ネストしたCJAValを 通常の方法で"="で 代入しようとすると、ライブラリにエラーがあると考える人がいることに気づいたからです。

これがMQL言語内で可能であればいいのですが。私 自身も修正しようと試みましたが、 MQL言語について深い知識を持っているわけではありませんし、今のところ"="を使った代入はうまくいっていません。

vivazzi/JAson
vivazzi/JAson
  • vivazzi
  • github.com
Realization of JSON protocol in mql4 / mql5. You can create JSON object with data of different types and run serialization and deserialization of JSON data. Installing Usage Add and create object to work with JSON data. See simple example for easy understand: WARNING : To assign other object to current, use method instead of using the "=" sign...
 
Артём Мальцев:

こんにちは!

JAsonライブラリのドキュメントはこのサイトでは完全ではありません。より詳細なドキュメントを書き、ユニットテストを追加しました: https://github.com/vivazzi/JAson。誰かの役に立つかもしれません。

innerJson(CJAValオブジェクト)を使うバグの説明があるissueを作成しました: https://github.com/vivazzi/JAson/issues/1.

CJAValオブジェクトが、オブジェクトとして別のCJAValオブジェクトに正しく代入されない:

回避策として、Set()メソッドを使用する必要があります:

もし誰かが助けてくれるなら、このバグは長年存在しているので、多くのMQL開発者は感謝するでしょう。

問題はCopyメソッドにあります。

        virtual bool Copy(const CJAVal &a) {
            m_key=a.m_key;
            CopyData(a);
            return true;
    }

キーがサブオブジェクトのキーで上書きされてしまうのです。あなたの例では、"b "が空の "nested_data "のキーで上書きされてしまいます。

私はこの簡単な解決策を使いました:

virtual bool Copy(const CJAVal &a) { if(m_key=="") m_key=a.m_key; CopyData(a); return true; }
 

Laszlo Tormasi さん、ありがとうございます!

あなたの修正でJAsonを更新しました: https://github.com/vivazzi/JAson

 

入れ子になったJson構造を"="記号で 代入する問題はLaszlo Tormasi 氏によってhttps://www.mql5.com/en/forum/65320/page3#comment_21453129。

JAsonバージョンは https://github.com/vivazzi/JAson。


問題を理解しようとし、助けてくれた皆さんに感謝します!

Libraries: JSON Serialization and Deserialization (native MQL)
Libraries: JSON Serialization and Deserialization (native MQL)
  • 2021.03.23
  • www.mql5.com
JSON Serialization and Deserialization (native MQL): Author: o_O...
 
ジェネリックなシリアライズとデシリアライズを操作するには?
 

負の配列添字で 発生していたエラー("array out of range")を修正。これにより、[]演算子はNULLを返すようになった。

処理はこのようになる。

void OnStart()
{
  CJAVal json, * jsC;

  // 追加 
  json[0] = 0;
  json[1] = 1;
  json[2] = 2;
  
  // チェック
  if ((jsC = json[-1]) == NULL)
    Print("Error. jsC is null!");
}

また、便宜上ToIntIメソッドを追加した。ToIntはlongを返すので。

int ToIntI() const { return (int)m_iv; }
ファイル:
JAson.mqh  31 kb
JasonTest.mq5  2 kb
 

ネストされたjsonの読み方がわかりません。

このような文字列があります:

string str=

{
  "key1": [
    {
      "key2": [
        {
          "key3": "val)"
        },
        {},
        {}
      ]
    }
  ]
}

どのように読み込んで要素にアクセスするのですか?

CJAVal data;
data.Deserialize(str);
Print(data["key1"][0][0]["key3"].ToStr());
どうやってもうまくいきません。
 
leonerd #:

ネストされたjsonの読み方がわかりません。

このような文字列があります:

これを読んで要素にアクセスするにはどうすればいいのでしょうか?

何度やっても理解できません。
string str;
CJAVal data;

str=
"{"
"  \"key1\": ["
"    {"
"      \"key2\": ["
"        {"
"          \"key3\": \"val)\""
"        },"
"        {},"
"        {}"
"      ]"
"    }"
"  ]"
"}";

data.Deserialize(str);
Print(data["key1"][0]["key2"][0]["key3"].ToStr());

もし、json文字列の構造が理解できなかったり、何か問題が発生した場合は、次のようにしてください:

string str;
CJAVal data; 
CJAVal *value;

str=
"{"
"  \"key1\": ["
"    {"
"      \"key2\": ["
"        {"
"          \"key3\": \"val)\""
"        },"
"        {},"
"        {}"
"      ]"
"    }"
"  ]"
"}";

data.Deserialize(str);

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;
}

Print(value.ToStr());

json文字列の 構造を簡単に理解するには、このサイト https://jsoneditoronline.org/。

JSON Editor Online - view, edit and format JSON online
  • Jos de Jong
  • jsoneditoronline.org
JSON Editor Online is a web-based tool to view, edit, format, transform, and diff JSON documents.