2012-10-27 11 views
6

Ad esempio:Come parse nested object/array usando parser jsoncpp in C++?

Json::Reader reader; 
    Json::Value val; 
    ifstream file("JSON/test.json"); 
    bool success = reader.parse(file, val, false); 
    vector<string> obj = val.getMemberNames(); 

    for (int i = 0; i < val.size(); i++) 
    { 
     // switch type of value 
     switch (val.get(obj.at(i), "default").type()) 
     { 
      case stringValue: 
       cout << "I'm string" << endl; 
       ... need to save **membername** and **value** 
       break; 
      case intValue: 
       cout << "I'm int" << endl; 
       ... need to save **membername** and **value** 
       break; 
      case nullValue: 
       cout << "I'm null" << endl; 
       break; 
      case arrayValue: 
       ... code to parse an array (with nested sure) ... 
       ... need to save 
       break; 
      case objectValue: 
       ... code to parse an object (with nested sure) ... 
       ... need to save 
       break; 
     } 
    } 

Esempio di file JSON (JSON/test.json):

{ 
    "layout": "fit", 
    "xtype": "viewport", 
    "height": 200, 
    "style": { 
       "backgroundColor": "46f0a8" 
      }, 

      "items": 
      [ 
      { 
       "title": "Management Console", 
       "padding": "10 10 10 10", 
       "bodyPadding": 10, 
       "autoScroll": true, 
       "items2": [1, 2, 3] 
      } 
      ] 
} 

Nella matrice articoli, possiamo vedere un'altra matrice (nested) chiamato items2 .

possibile riscontrare i seguenti per gli array:

array[Jacob, Joseph] or 
array[{name: Jacob, name: Joseph}] or 
array[{name: Jacob}, {name: Joseph}] 

Per gli oggetti è simile. In ogni campo, ovviamente, possono essere molti oggetti/matrici annidate. Come posso salvare i dati in variabili C++?

+0

Non è abbastanza chiaro per me, cosa stai chiedendo davvero. Vedo 3 domande. Come posso elaborare i dati 'array' e' object' nella libreria 'jsoncpp'? Come posso adattarmi alle diverse convenzioni per l'archiviazione dei dati? Come gestisco casi generali/nidificati? – luk32

+0

Non è chiaro se si desidera analizzare una classe C++ predefinita o se si desidera analizzare dati JSON arbitrari. Per quest'ultimo caso, non c'è davvero alcun punto che converta 'JSON :: Value' in altri formati; basta usare 'JSON :: Value' direttamente. –

risposta

0

Si desidera rendere ricorsiva la funzione di analisi principale. Quindi usa classi STL come vettori che ti consentono di allocare dinamicamente più spazio per i tuoi dati.