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

 

Die Bibliothek ist sehr nützlich. Aber ich bin darauf gestoßen, dass bei der Serialisierung von Werten des Typs double ein starker Verlust an Präzision auftritt.

Beispiel:

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]);

Nach der Serialisierung erhalte ich:

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

D.h. die letzten 2 signifikanten Zeichen gehen einfach verloren und alle Werte im Array werden einfach gleich. Infolgedessen gehen alle Berechnungen, die auf diesen Daten basieren, ins Leere....

Schließlich habe ich das Problem durch die Umwandlung von Array-Werten in Strings gelöst.

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

Hallo zusammen!

Die Dokumentation der JAson-Bibliothek ist nicht vollständig auf dieser Seite. Ich habe die Dokumentation mit mehr Details geschrieben und Unit-Tests hinzugefügt: https://github.com/vivazzi/JAson. Es könnte für jemanden nützlich sein.

Fügen Sie ich erstellt Ausgabe, die Beschreibung der Fehler der Verwendung von inneren Json (CJAVal Objekt) hat: https://github.com/vivazzi/JAson/issues/1.

Das CJAVal-Objekt wird nicht korrekt einem anderen CJAVal-Objekt als Objekt zugewiesen:

CJAVal data;

// einfache Struktur
data["a"] = 12;

// verschachtelte Struktur
CJAVal nested_data;
nested_data["k1"] = 7;
nested_data["k2"] = "baz";

data["b"] = nested_data;

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

Als Workaround muss man die Methode Set() verwenden:

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

Wenn jemand helfen kann, dann werden viele MQL-Entwickler dankbar sein, da dieser Fehler schon seit vielen Jahren besteht.

 

Hallo zusammen!!!

Die JAson-Dokumentation ist auf dieser Seite nicht vollständig, also habe ich eine ausführlichere Dokumentation https://github.com/vivazzi/JAson/ geschrieben und Unit-Tests hinzugefügt: vielleicht findet sie jemand nützlich.

Und ich habe das Problem der Verwendung eines verschachtelten Json (CJAVal Objekt) beschrieben: https://github.com/vivazzi/JAson/issues/1.

Das CJAVal-Objekt wird nicht korrekt gespeichert, wenn Sie das Zeichen "=" verwenden (ein leerer Schlüssel wird gespeichert):

CJAVal data;

// einfache Struktur
data["a"] = 12;

// verschachtelte Struktur
CJAVal nested_data;
nested_data["k1"] = 7;
nested_data["k2"] = "baz";

data["b"] = nested_data;

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

Ja, in den Tests, die auf der Bibliotheksseite auf dieser Website beigefügt sind, können Sie feststellen, dass Sie die Set()-Methode verwenden müssen:

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

Aber wenn jemand die Bibliothek so korrigieren kann, dass es möglich ist, verschachtelte Json-Strukturen über das "="-Zeichen zu speichern, würde das vielen Leuten helfen. Mir ist nämlich aufgefallen, dass manche Leute denken, die Bibliothek hätte Fehler, wenn sie versuchen, eine verschachtelte CJAVal auf die übliche Weise über "=" zuzuweisen .

Ich hoffe, das ist in der MQL-Sprache überhaupt möglich. Ich habe versucht, es selbst zu korrigieren, aber ich habe keine tiefen Kenntnisse der MQL-Sprache, und bisher hat es nicht funktioniert, die Zuweisung über "=" zu tun.

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...
 
Артём Мальцев:

Hallo zusammen!

Die Dokumentation der JAson-Bibliothek ist nicht vollständig auf dieser Seite. Ich habe die Dokumentation mit mehr Details geschrieben und Unit-Tests hinzugefügt: https://github.com/vivazzi/JAson. Es könnte für jemanden nützlich sein.

Fügen Sie ich erstellt Ausgabe, die Beschreibung der Fehler der Verwendung von inneren Json (CJAVal Objekt) hat: https://github.com/vivazzi/JAson/issues/1.

Das CJAVal-Objekt wird nicht korrekt einem anderen CJAVal-Objekt als Objekt zugewiesen:

Als Workaround müssen Sie die Methode Set() verwenden:

Wenn jemand helfen kann, dann werden viele MQL-Entwickler dankbar sein, da dieser Fehler schon seit vielen Jahren besteht.

Das Problem liegt in der Copy-Methode.

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

Der Schlüssel wird mit dem Schlüssel des Unterobjekts überschrieben, in Ihrem Beispiel wird "b" mit dem Schlüssel von "nested_data" überschrieben, der leer ist.

Ich habe diese einfache Lösung verwendet, nicht vollständig getestet:

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

Vielen Dank, Laszlo Tormasi - Ihr Fix funktioniert und alle Tests haben bestanden!

Ich habe JAson mit Ihren Korrekturen aktualisiert: https://github.com/vivazzi/JAson

 

Das Problem der Zuweisung von verschachtelten Json-Strukturen über das "="-Zeichen wurde von Laszlo Tormasi im Kommentar https://www.mql5.com/en/forum/65320/page3#comment_21453129 gelöst .

JAson-Version mit Änderungenunter https://github.com/vivazzi/JAson.


Danke an alle, die versucht haben, das Problem zu verstehen und zu helfen!

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...
 
Wie kann man die generische Serialisierung und Deserialisierung beeinflussen?
 

Ein Fehler ("array out of range"), der bei negativen Array-Indizes auftrat, wurde behoben. Jetzt gibt der [] Operator NULL zurück.

Die Verarbeitung sieht jetzt so aus.

void OnStart()
{
  CJAVal json, * jsC;

  // Hinzufügen 
  json[0] = 0;
  json[1] = 1;
  json[2] = 2;
  
  // prüfen
  if ((jsC = json[-1]) == NULL)
    Print("Error. jsC is null!");
}

Außerdem habe ich der Einfachheit halber die Methode ToIntI hinzugefügt. Da ToInt long zurückgibt.

int ToIntI() const { return (int)m_iv; }
Dateien:
JAson.mqh  31 kb
JasonTest.mq5  2 kb
 

Ich verstehe nicht, wie man das verschachtelte json lesen kann.

Hier ist eine Zeichenfolge wie diese:

string str=

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

Wie kann ich sie lesen und auf die Elemente zugreifen?

CJAVal data;
data.Deserialize(str);
Print(data["key1"][0][0]["key3"].ToStr());
Egal wie ich es versuche, es funktioniert nicht.
 
leonerd #:

Ich verstehe nicht, wie man das verschachtelte json lesen kann.

Hier ist eine Zeichenfolge wie diese:

Wie kann ich sie lesen und auf die Elemente zugreifen?

Egal, wie oft ich es versuche, ich kann es nicht verstehen.
string str;
CJAVal data;

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

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

Wenn Sie die Struktur Ihrer json-Zeichenkette nicht verstehen oder etwas schief läuft, gehen Sie wie folgt vor:

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());

Um die Struktur einer json-Zeichenkette leicht zu verstehen , verwenden Sie diese Website: 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.