Bibliotheken: JSON Serialization and Deserialization (native MQL) - Seite 17

[Gelöscht]  

Diese Bibliothek verursacht ERROR und ich habe es bestätigt

ERR_WRONG_STRING_PARAMETER
 
5040
 
Damaged parameter of string type
 

mein Code

CJAVal  jv;
string text="abc";

jv.Deserialize(text);

Irgendeine Idee, wie man das Problem beheben kann?

Es verursacht nur, wenn ich eine beliebige Zeichenfolge desearilize

 

Wenn der String-Wert ein ';'-Zeichen enthält, schlägt Deserialize fehl!

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

 
Dmitry Zhakov

Alles funktioniert. Ich habe das Problem auf meiner Seite gefunden.

 
Als Sie . Ich sende POST WebRequests (http) von MT5 (MQL5) zu Chat GPT-4-o-mini API (openai.com) . OpenAI empfängt JSON Daten . MQL unterstützt JSON nicht . Also musste ich den String in einen String umwandeln, dann den String in ein Char[]-Array konvertieren, um ihn als postData in den WebRequest einzufügen. Ich verwende Ihre Bibliothek, ich werde Sie wissen lassen, wie ich vorankomme.
 
Philip Kym Sang Nelson #:
Als Sie . Ich sende POST WebRequests (http) von MT5 (MQL5) zu Chat GPT-4-o-mini API (openai.com) . OpenAI empfängt JSON Daten . MQL unterstützt JSON nicht. Also musste ich den String in einen String umwandeln, dann den String in ein Char[] Array konvertieren, um ihn als postData in den WebRequest einzufügen. Ich verwende Ihre Bibliothek, ich werde Sie wissen lassen, wie ich weiterkomme.

Das ist fantastisch
Ich habe das gleiche gedacht, um meine ML mit der Antwort von ChatGPT zu füttern.
Macht es Ihnen etwas aus, wie Sie es gemacht haben? Was sind die Herausforderungen?

Danke!

 
Es funktioniert perfekt Kudos :) Y'll gehen und überprüfen Sie meinen Beitrag über die Verwendung von CJVAL Klasse zu parsen json Daten Extrahieren bestimmter Daten aus JSON-Antworten in MetaTrader 5
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!
 

Hallo, gibt es eine Möglichkeit,:

- den Wert eines Schlüssels auf null zu setzen

- Den Wert eines Schlüssels auf {} (leeres Objekt) zu setzen

Es scheint, dass diese Werte nicht korrekt dargestellt werden, wenn Sie versuchen, sie zu setzen.

Danke für jede Antwort

 

Was mache ich falsch?
Ein echtes Beispiel aus der Praxis. Eine Zeichenkette mit 21+ tausend Zeichen Länge. Mehrere Variablen und 2 große Arrays b und a. Es gibt 500 Subarrays mit jeweils 2 Elementen:

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


Ich habe eine Diskrepanz zwischen den Originaldaten und den Daten, die JASON ausgibt, gefunden:

["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

Die ersten 2 Zeilen geben das Ende der ursprünglichen Zeichenkette aus, die von JASON geparst wird.
Beim Parsen werden alle Elemente in das Array geschrieben. Es erhält n=2000 Elemente. Das ist korrekt.
Dann sind 2 Zeilen die ersten 20 Elemente des Arrays und 2 weitere Zeilen die letzten 20 Elemente.
Am Anfang des Arrays stimmt alles überein.
Aber am Ende stimmt die erste Ziffer der Paare überein, aber die zweite nicht. Offenbar wurde sie von irgendwo anders übernommen.

Ich habe es überprüft. Das zweite Array a enthält Daten aus dem ersten Array b. Hier ist das Ende der ursprünglichen Daten aus Array a:

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

D.h. das zweite Array enthält in Subarrays in den ersten Elementen seinen /rechten Wert, in den zweiten Elementen - Werte aus dem ersten Array.
Das Problem liegt wahrscheinlich im Parser-Code.

Datenersetzung ist sehr anstrengend - wie kann man sie später testen? Nur falsch! Gut, dass Sie es bemerkt haben. Bei einfacheren Varianten ohne verschachtelte Arrays funktioniert es hoffentlich richtig. Aber man sollte alles testen, bevor man es in Betrieb nimmt.

Der Code basiert auf den Beispielen aus dem Zweig, nur mit meinem Datenstring:

 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++;//Preis
      bin[n]=json["data"]["b"][i][1].ToDbl();; n++;//Volumen
   }

   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++;//Preis
      bin[n]=json["data"]["b"][i][1].ToDbl(); n++;//Volumen
   }
   
   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));
}

Der vollständige Code des Skripts mit diesem String ist angehängt.
Bibliothek der neuesten Version "1.13" - heruntergeladen von GitHub.

Dateien:
3.mq5  53 kb
 

Oben wird auch über Probleme mit dem zweiten Element geschrieben. Wahrscheinlich das gleiche Problem.

Ich habe mir ein Daten-Parsing für eine bestimmte Vorlage, durch die Aufteilung durch Anführungszeichen " mit der anschließenden Auswahl der Elemente nach Nummer.

Minus - für jede Vorlage haben, um Zeit zu verbringen und schreiben ihre eigenen Parser und zählen die Anzahl der Elemente ...
Plus - 3 mal schneller universell und bequem JASON. Anstelle von 40 Sekunden 13 auf die ursprünglichen Daten ~400 Mb.

Verbrachte einen halben Tag auf sie.
Genauer gesagt auf 3 Versionen:
1) zuerst suchte ich nach bestimmten Teilstrings in char Array und dann zusammengesetzt Strings aus ihren Werten - ich nahm an, dass dies die schnellste Code
Ich wollte direkt mit char Array zu arbeiten, weil ich das Original von WebRequest oder FileOpen haben und wollte nicht, um es in eine große Zeichenfolge für die Geschwindigkeit zu montieren.
2) dann habe ich aus char[] Strings nur mit den Arrays b und a erstellt - und sie aufgeteilt
3) und schließlich der einfachste Code - jeder String wurde zu einem großen Textstring zusammengefasst (mit allen Daten, auch den unnötigen) und aufgeteilt

Es stellte sich heraus, dass alle 3 Varianten in der Geschwindigkeit ungefähr gleich sind. Deshalb habe ich mich für die einfachste Variante entschieden - die 3. Es wird einfacher sein, sie später an andere Vorlagen mit anderen Daten anzupassen.

Aus irgendeinem Grund dachte ich, dass die Arbeit mit einem char-Array schneller sein wird als das Zusammensetzen zu einem String und das Aufteilen in ein String-Array durch ". Offensichtlich ist split gut auf Geschwindigkeit optimiert.

Es wäre gut, wenn die MQ-Entwickler einige der Standard-JSON-Parser in die Sprache aufnehmen würden. JASON parst nicht alle Varianten korrekt und anscheinend ist der Entwickler nicht mehr da und es besteht keine Hoffnung auf eine Lösung.
 
Forester #:
Bibliothek der neuesten Version "1.13" - heruntergeladen von GitHub

Es gibt einen umgeschriebenen Fork des Codes aus dieser Topik (1.12). Haben Sie mit dem Original überprüft?

PS: Ich habe 1.12 original und stark korrigiert. Ich erinnere mich nicht, woher die Korrekturen kamen, wahrscheinlich aus diesem Zweig.