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

削除済み  

このライブラリはERRORを引き起こす。

ERR_WRONG_STRING_PARAMETER
 
5040
 
Damaged parameter of string type
 

私のコード

CJAVal  jv;
string text="abc";

jv.Deserialize(text);

どうすれば直りますか?

任意の文字列をデシリアライズしたときだけ発生します。

 

文字列値に';'文字が含まれている場合、Deserializeは失敗します!

array out of range in 'JAson.mqh' (205,13)

 
Dmitry Zhakov

すべてうまくいきました。私の方で問題が見つかりました。

 
あなたより。私はMT5(MQL5)からチャットGPT-4-o-mini API(openai.com)にPOST WebRequests(http)を送信しています。 OpenAIはJSONデータを受信します。 MQLはJSONをサポートしていません。そのため、文字列に変換し、文字列をChar[]配列に変換して、WebRequestにpostDataとして挿入する必要がありました。 あなたのライブラリを使用しています。
 
Philip Kym Sang Nelson #:
あなたより。私はMT5(MQL5)からチャットGPT-4-o-mini API(openai.com)にPOST WebRequests(http)を送信しています。OpenAIはJSONデータを受信します。MQLはJSONをサポートしていません。そのため、文字列に変換し、文字列をChar[]配列に変換して、WebRequestにpostDataとして挿入する必要がありました。あなたのライブラリを使用しています。

それはすごい
私もChatGPTからの応答でMLをフィードするために同じことを考えていました。
あなたはどのようにそれをしましたか?

ありがとうございます!

 
完璧に動作します。)CJVALクラスを使用してjsonデータを解析する方法に関する私の投稿を確認してくださいMetaTrader 5でJSONレスポンスから特定のデータを抽出する
Trading blogs and financial markets analysis
Trading blogs and financial markets analysis
  • www.mql5.com
Read blogs to find the latest news on various topics from all over the world — rumors about companies, country and industry reports, market analysis, latest developments in speculative trading and more. Start your own blog to share new ideas and trading achievements with the members of MQL5.community. Post interesting images and videos, enjoy unlimited possibilities!
 

こんにちは:

- キーの値をnullに 設定する

- キーの値を{}(空のオブジェクト)に設定する。

これらの値を設定しようとしても、正しく表現されないようです。

ご回答ありがとうございました。

 


実際の練習例。21,000文字以上の文字列。いくつかの変数と2つの大きな配列bとa。それぞれ2要素のサブ配列が500個ある:

"b":[["0.0018659","8500"],["0.0018655","16800"],...],
"a":[["0.0018659","8500"],["0.0018655","16800"],...],


元データとJASONが出力するデータの間に矛盾があることがわかりました:

["0.0019640","800"],["0.0019641","91500"],["0.0019644","96600"],["0.0019645","503900"],["0.0019646","101600"],
["0.0019649","500"],["0.0019650","300"],["0.0019651","1200"],["0.0019652","500"],["0.0019653","800"]],
n=2000
[ 0]      0.0018659,  8500.0000000,     0.0018655, 16800.0000000,     0.0018654,153000.0000000,     0.0018653,  3800.0000000,     0.0018650,   300.0000000
[10]      0.0018649,   900.0000000,     0.0018647,  2900.0000000,     0.0018645,  6700.0000000,     0.0018644, 33700.0000000,     0.0018640,  9600.0000000
[ 0]     0.0019640,  200.0000000,    0.0019641,25600.0000000,    0.0019644, 3000.0000000,    0.0019645, 3800.0000000,    0.0019646,  200.0000000
[10]     0.0019649, 3600.0000000,    0.0019650,  700.0000000,    0.0019651,  200.0000000,    0.0019652,  700.0000000,    0.0019653,  100.0000000

最初の2行は、JASONによって解析された元の文字列の終わりを出力している。
解析時、全ての要素が配列に書き込まれる。n=2000の要素が得られます。これは正しい。
それから、2行が配列の 最初の20個の要素、さらに2行が最後の20個の要素である。
配列の最初では、すべてが一致している。
しかし、最後では、ペアの最初の桁は一致して いるが、2番目の桁は一致して いない。どうやら、どこかから取得したようだ。

調べてみた。番目の配列aは1番目の配列bのデータを含んでいる。これが配列aの元データの最後だ:

,["0.0017785","200"],["0.0017784","3600"],["0.0017783","700"],["0.0017782","200"],["0.0017781","700"],["0.0017780","100"]],

つまり、2番目の配列のサブ配列の最初の要素にはその/rightの値が、2番目の要素には最初の配列の値が含まれている。
おそらくパーサーのコードに問題があるのだろう。

データの置換は非常にストレスがかかる。後でどうやってテストするのか?間違っている!あなたがそれに気づいたのは幸運でした。ネストされた配列のない、より単純なバリアントでは正しく動作することを願っています。

このコードはブランチにある例に基づいていますが、私のデータ文字列のみを使用しています

 void TestJAson(string msg) {
   CJAVal json; 
   json.Deserialize(msg);
   double bin[];int n=0;
   int s=ArraySize(json["data"]["b"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["b"][i][0].ToDbl(); n++;//価格
      bin[n]=json["data"]["b"][i][1].ToDbl();; n++;//ボリューム
   }

   s=ArraySize(json["data"]["a"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["a"][i][0].ToDbl(); n++;//価格
      bin[n]=json["data"]["b"][i][1].ToDbl(); n++;//ボリューム
   }
   
   Print(StringSubstr(msg,StringLen(msg)-300,300));
   
   int tot=ArraySize(bin);
   Print("n=",tot);
   ArrayPrint(bin,7,",",0,20);
   ArrayPrint(bin,7,",",tot-20,20);
}

void OnStart(){
   ulong from=GetMicrosecondCount();
   TestJAson(message);
   ulong to=GetMicrosecondCount();
   PrintFormat("MQL %lu mcs/iteration",(to-from));
}

この文字列を使ったスクリプトの完全なコードを添付します。
最新バージョン「1.13」のライブラリ - GitHubからダウンロード。

ファイル:
3.mq5  53 kb
 

上記では、2つ目の要素の問題についても書いている。おそらく同じ問題だろう。

私は、引用符 " による分割と、それに続く番号による要素の選択を通して、特定のテンプレートのためのデータ解析を自分で作りました。

マイナス - 各テンプレートのために時間を費やし、独自のパーサーを記述し、要素の数をカウントする必要があります...
プラス - 3倍速く、普遍的で便利なJASON。代わりに、初期データ〜400 Mbで40秒13。

それに半日を費やした。

1) まず、char配列から特定の部分文字列を検索し、その値から文字列を組み立てた - これが最速のコードになると想定していた
直接char配列を操作したかった。WebRequestや FileOpenのオリジナルがあり、スピードのために大きな文字列に組み立てたくなかったから。
2次に、char[]から、配列bとaだけで文字列を作り、
3)そして最後に、最も単純なコード - 各文字列を1つの大きなテキスト文字列(不要なものを含むすべてのデータを含む)に集め、

それを分割しました。すべての3つのバリエーションがほぼ同じ速度であることが判明しました。そのため、最も単純な3番目のバリエーションに決めた。後で他のデータを持つ他のテンプレートに変更するのも簡単だろう。

どういうわけか、char配列を扱う方が、文字列に組み立てて".どうやらsplitはスピードに最適化されているようだ。

MQの開発者が 、標準的なJSONパーサーのいくつかをこの言語に追加してくれるといいのだが。JASONはすべてのバリアントを正しくパースしない。
 
Forester #:
最新バージョン「1.13」のライブラリ - GitHubからダウンロード

このトピック(1.12)のコードを書き直したフォークがあります。オリジナルで確認しましたか?

追記:1.12のオリジナルと大幅な修正があります。どこから修正したかは覚えていないが、おそらくこのブランチからだろう。