2013-06-15 13 views
14

Ciao là Ho un file che contiene un po 'di JSON che assomiglia:Come posso analizzare array JSON con C++ aumentare

{ 
    "frame": 
    { 
    "id": "0", 
    "points": 
    [ 
     [ "0.883", "0.553", "0" ], 
     [ "0.441", "0.889", "0" ], 
    ] 
    }, 
    "frame": 
    ... 
} 

Qualcuno sa come analizzare i valori della doppia array usando C++ e aumentare ptree?

Thx in anticipo!

+0

http://www.boost.org/doc/libs/1_41_0/doc/html/property_tree/reference.html#header.boost.property_tree.json_parser_hpp – riv

+0

PTree lo accetterà, ma rigorosamente i nomi delle proprietà ripetute che parlano non sono JSON validi. –

risposta

22

Usa gli iteratori, Luke.

In primo luogo, è necessario analizzare il file:

boost::property_tree::ptree doc; 
boost::property_tree::read_json("input_file.json", doc); 

... ora, perché sembra di avere le chiavi multiple "Frame" nel dizionario livello superiore è necessario scorrere su di loro:

BOOST_FOREACH (boost::property_tree::ptree::value_type& framePair, doc) { 
    // Now framePair.first == "frame" and framePair.second is the subtree frame dictionary 
} 

iterare su righe e colonne è lo stesso:

BOOST_FOREACH (boost::property_tree::ptree::value_type& rowPair, frame.get_child("points")) { 
    // rowPair.first == "" 
    BOOST_FOREACH (boost::property_tree::ptree::value_type& itemPair, rowPair.second) { 
     cout << itemPair.second.get_value<std::string>() << " "; 
    } 
    cout << endl; 
} 

non ho la prova il codice, ma il l'idea funzionerà :-)

+0

'get_value' è una funzione, quindi è necessario'() '. Non impostare boost ma sembra legittimo altrimenti. – riv

+0

ha funzionato per me con framePair.second.get_child ("punti") come hai detto e ho dovuto cambiare il tipo di dati nel cout da doppio a stringa. grazie per l'aiuto!! – user934801

+0

Grazie, ho risolto i problemi che hai menzionato. – cube