J'ai un fichier comme celui-ci:
[data.json]
{
"electron": {
"pos": [0,0,0],
"vel": [0,0,0]
},
"proton": {
"pos": [1,0,0],
"vel": [0,0.1,0]
},
"proton": {
"pos": [-1,0,0],
"vel": [0,-0.1,-0.1]
}
}
Comment créer un vecteur de particules à partir de l'analyse de ce fichier. Si je comprends bien, j'ai besoin de lire le fichier en utilisant boost et de lire les chaînes (lignes) dans un vecteur, puis d'analyser le contenu du vecteur.
La particule de classe est quelque chose comme ceci:
class Particle
{
private:
particle_type mtype; // particle_type is an enum
vector<double> mPos;
vector<double> mVel;
};
D'autres méthodes pour get/set ont été omises dans la classe.
En gros, je voudrais de l'aide pour créer un vector<Particle>
avec les données de position et de vitesse correctes et les données de type de particules analysées. Merci d'avance.
Code en principal:
int main(){
boost::property_tree::ptree pt;
boost::property_tree::read_json("data.json", pt);
}
J'ai un peu modifié votre JSON. Code légèrement non testé.
{
"particles": [
{
"electron": {
"pos": [
0,
0,
0
],
"vel": [
0,
0,
0
]
},
"proton": {
"pos": [
-1,
0,
0
],
"vel": [
0,
-0.1,
-0.1
]
}
}
]
}
...
#ifdef _MSC_VER
#include <boost/config/compiler/visualc.hpp>
#endif
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
#include <cassert>
#include <exception>
#include <iostream>
#include <sstream>
#include <string>
int main()
{
try
{
std::stringstream ss;
// send your JSON above to the parser below, but populate ss first
boost::property_tree::ptree pt;
boost::property_tree::read_json(ss, pt);
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("particles.electron"))
{
assert(v.first.empty()); // array elements have no names
std::cout << v.second.data() << std::endl;
// etc
}
return EXIT_SUCCESS;
}
catch (std::exception const& e)
{
std::cerr << e.what() << std::endl;
}
return EXIT_FAILURE;
}
Modifiez comme bon vous semble.
Imprimez l'arborescence entière pour voir ce qui est lu. Cela aide au débogage.
void print(boost::property_tree::ptree const& pt)
{
using boost::property_tree::ptree;
ptree::const_iterator end = pt.end();
for (ptree::const_iterator it = pt.begin(); it != end; ++it) {
std::cout << it->first << ": " << it->second.get_value<std::string>() << std::endl;
print(it->second);
}
}
Vous pouvez parcourir le code suivant:
boost::property_tree::basic_ptree<std::string,std::string>::const_iterator iter = pt.begin(),iterEnd = pt.end();
for(;iter != iterEnd;++iter)
{
iter->first; // Your key, at this level it will be "electron", "proton", "proton"
iter->second; // The object at each step {"pos": [0,0,0], "vel": [0,0,0]}, etc.
}
J'espère que cela aide
Je corrige juste des problèmes avec la réponse ci-dessus mais je n'ai pas pu obtenir la mise en forme correcte dans les commentaires:
#ifdef _MSC_VER
#include <boost/config/compiler/visualc.hpp>
#endif
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
#include <cassert>
#include <exception>
#include <iostream>
#include <sstream>
#include <string>
void print(boost::property_tree::ptree const& pt)
{
using boost::property_tree::ptree;
ptree::const_iterator end = pt.end();
for (ptree::const_iterator it = pt.begin(); it != end; ++it) {
std::cout << it->first << ": " << it->second.get_value<std::string>() << std::endl;
print(it->second);
}
}
int main()
{
try
{
std::stringstream ss;
// send your JSON above to the parser below, but populate ss first
ss << "{ \"particles\": [ { \"electron\": { \"pos\": [ 0, 0, 0 ], \"vel\": [ 0, 0, 0 ] }, \"proton\": { \"pos\": [ -1, 0, 0 ], \"vel\": [ 0, -0.1, -0.1 ] } } ]}";
boost::property_tree::ptree pt;
boost::property_tree::read_json(ss, pt);
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("particles"))
{
assert(v.first.empty()); // array elements have no names
print(v.second);
}
return EXIT_SUCCESS;
}
catch (std::exception const& e)
{
std::cerr << e.what() << std::endl;
}
return EXIT_FAILURE;
}