2012-04-06 3 views
10
{"hi": "hellow", 
"first": 
    {"next":[ 
      {"key":"important_value"} 
     ] 
    } 

} 

Zugriff RapidJSON innerhalb Array:RapidJSON Bibliothek durch seinen Index einen Wert innerhalb eines Arrays immer

dies funktioniert: cout << "HI VALUE:" << variable["hi"].GetString() << endl; erhalten Sie folgende Ausgabe: hellow wie erwartet, ist das Problem, wie im Inneren Werte zugreifen, wenn ich will Get "Important_Value", habe ich etwas wie folgt versucht: cout << "Key VALUE:" << variable["first"]["next"][0]["key"].GetString() << endl ; aber das funktioniert nicht, ich möchte in der Lage sein, den "wichtig_Wert" durch das erste Element des Arrays zu bekommen, und in diesem Fall ist es die [0], die Fehler verursacht.

Wie mache ich, um es durch seinen Index zu bekommen? Ich hoffe, es ist klar, meine Erklärung.

Vielen Dank im Voraus.

Antwort

20

JSON

{"hi": "hellow", "first": {"next":[{"key":"important_value"} ] } } 

Code:

rapidjson::Document document;  

if (document.Parse<0>(json).HasParseError() == false) 
{ 
    const Value& a = document["first"]; 

    const Value& b = a["next"]; 

    // rapidjson uses SizeType instead of size_t. 
    for (rapidjson::SizeType i = 0; i < b.Size(); i++) 
    { 
     const Value& c = b[i]; 

     printf("%s \n",c["key"].GetString()); 
    }   
} 

Wird important_value

+1

dies beantwortet nichts fella, machen Sie ein Beispiel aus meinem Beispiel mit den Klammern [], die Klammern sind das Problem, weil es eine automatische Position von Arrays ist, die erste ist 0, nächste ist 1 und so weiter .. Was du getan hast, habe ich bereits, versuche den Wert zu bekommen wie in meinem Beispiel, benutze die selbe Quelle. – Grego

+0

Probieren Sie das aus ........ – mola10

+0

Dies ist genau das, was ich suche, geschachtelten Objekt in Array-Mitglied zugreifen. +1 – haxpor

2

Ich bemerkte dies in der tutorial.cpp Datei drucken;

// Note: 
//int x = a[0].GetInt();   // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type. 
int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work. 
int z = a[0u].GetInt();   // This works too. 

Ich habe es nicht getestet, aber Sie möchten vielleicht eine dieser versuchen;

variable [ "erster"] [ "next"] [0U] [ "key"]. GetString()

variable [ "erster"] [ "next"] [Sizetype (0)] [“ Schlüssel "]. GetString()

13

[Update]

Durch geschickte Arbeit der Autoren kann RapidJSON jetzt wörtliche 0 von String Mehrdeutigkeiten. Also das Problem ist nicht mehr passiert.

https://github.com/miloyip/rapidjson/issues/167


Das Problem, wie mjean erwähnt, ist der Kompilierer nicht in der Lage, um zu bestimmen, ob sie das Objektelement Accessor oder das Feldelement Accessor nennen soll, durch literial 0:

GenericValue& operator[](const Ch* name) 
GenericValue& operator[](SizeType index) 

Mit [0u] oder [SizeType(0)] kann dies umgehen.

Eine andere Möglichkeit, dieses Problem zu lösen, ist die Verwendung der überladenen Version für den Operator []. Verwenden Sie beispielsweise operator() für einen Zugriffstyp. Oder unter Verwendung normaler Funktionen, z. B. GetMember(), GetElement(). Aber ich habe jetzt keine Vorliebe dafür. Andere Vorschläge sind willkommen.

0

Wenn Sie es mit Klammern zugreifen möchten, dann können Sie die folgenden Befehle verwenden:

int i=0; 
cout<<"Key VALUE:"<<variable["first"]["next"][i]["key"].GetString()<<endl ; 

Ausgang: Schlüsselwert: important_value

Es ist für mich gearbeitet.

Verwandte Themen