Verständnisproblem JSON decode

 

Hallo liebes Forum!

 

Ich möchte aus meiner eigenen DB per https request Daten für meinen Indikator extrahieren. Da ich bereits in anderen projekten mit JSON arbeite ( MySql <> PHP ) , möchte ich dies auch in mql4 beibehalten.

Hier in der DB bin ich auf diesen JSON Parser gestoßen:  https://www.mql5.com/de/code/11134

 

Mein JSON Object schaut so aus und wird als string in mql4 reingeholt:

{
  "meta": {
    "statusCode": 200,
    "duration": 12.824
  },
  "data": {
    "id": 13412318,
    "refQuotation": {
      "quote": {
        "value": 24.4898,
        "time": "2016-08-05T09:20:22.000Z"
      }
    }
  }
}

 Das Objekt meta enthält also die Zahl statusCode. nun versuche ich erslmal zum test diese zu extrahieren mittels:

 

jo.getObject("data").getString("statusCode")

bzw.

jo.getObject("data").getDouble("statusCode")

 

Jedoch schlägt die fehl mit : "invalid pointer access in 'json.mqh' (247,20)"

Hier noch der ganze Block :

 

#property strict
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100

#include <mql4-http.mqh>
#include <hash.mqh>
#include <json.mqh>

int OnInit() {

        string response = httpGET("URL_REMOVED");

        JSONParser *parser = new JSONParser();

        JSONValue *jv = parser.parse(response);

        if ( jv.isObject() ) {

                JSONObject *jo = jv;

                string MyVar = jo.getObject("data").getString("duration");

                Alert(MyVar);

        }
        delete jv;
        delete parser;


        //{"meta":{"statusCode":200,"duration":10.434},"data":{"id":13412318,"refQuotation":{"quote":{"value":-14.2857,"time":"2016-08-04T18:06:42.000Z"}}}}

        return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                                const int prev_calculated,
                                const datetime &time[],
                                const double &open[],
                                const double &high[],
                                const double &low[],
                                const double &close[],
                                const long &tick_volume[],
                                const long &volume[],
                                const int &spread[]) {

        return(rates_total);
}

Der string kommt korrekt aus der url raus denn die Key Iteration funktioniert beispielsweise:

            // Loop over object keys
            JSONIterator *it = new JSONIterator(jo);
            for( ; it.hasNext() ; it.next()) {
                Print("loop:"+it.key()+" = "+it.val().toString());
            }

leads to:

loop:data = {"refQuotation" : {"quote" : {"value" : -5.4545,"time" : "2016-08-05T09:31:46.000Z"}},"id" : 13412318}
loop:meta = {"duration" : 12.679,"statusCode" : 200}

Was die korrekt Ausgabe wäre.

Weiß jemand Rat? Oder hat jemand eine Idee, wie ich Value aus dem String extrahieren kann? 

 

Danke fürs Lesen

derdigge 

 
Wenn ich den Text so lese, würde ich ja folgendes annehmen
jo.getObject("meta").getString("statusCode")

bzw.

jo.getObject("meta").getDouble("statusCode")
Gruß Uwe
 
Uwe Goetzke:
Wenn ich den Text so lese, würde ich ja folgendes annehmenGruß Uwe

Hey Uwe :)

 

incorrect casting of pointers in 'json.mqh' (57,21)

 

Genau das war auch mein Impuls. Nur leider führt es zum selben Ergebnis. 

 

Nur folgendes geht:

 jo.getObject("data").getObject("refQuotation").getObject("quote").getString("time")

 

Er mag die nicht, bei denen die Gänsefüßchen fehlen :)  Das ist doch mal ne Erkenntnis. Jemand ne Idee wie ich das fix? stringreplace?

 
derdigge:

Hey Uwe :)

 

 

Genau das war auch mein Impuls. Nur leider führt es zum selben Ergebnis. 

 

Nur folgendes geht:

 jo.getObject("data").getObject("refQuotation").getObject("quote").getString("time")

 

Er mag die nicht, bei denen die Gänsefüßchen fehlen :)  Das ist doch mal ne Erkenntnis. Jemand ne Idee wie ich das fix? stringreplace?

Okay ich habs!

Im Code vom PArser fiel es auf, nur doubles liest die Libary ohne Gänsefüßchen

 

  jo.getObject("data").getObject("refQuotation").getObject("quote").getDouble("value") ; 

 

funktioniert somit.

Danke  !

Grund der Beschwerde: