2010-07-19 3 views
0

Je ne sais pas comment l'expliquer - je suis assez nouveau pour C++, mais ... laissez-moi essayer:C++: Comment mettre en œuvre (quelque chose comme) JSON

Disons que j'ai 300+ noms (Jeff, Jack ...) avec 300+ int valeurs (0 ou 1). Dans JS j'utiliserais JSON. Quelque chose comme ceci:

var people = {"person": [ 
       {"name": "Jeff","val": 0}, 
       {"name": "Jill","val": 1}, 
       {"name": "Jack","val": 0}, 
       {"name": "Jim","val": 1}, 
       {"name": "John","val": 0} 
]} 

Quelle est la meilleure façon de faire cela en C++? Merci.

+3

Je vous déconseillerais de mettre en œuvre ** quelque chose comme ** JSON: utilisez une bibliothèque existante ou implémentez la vraie norme JSON. – ereOn

+3

Qu'est-ce que tu veux? Une représentation textuelle de la structure de données? Ou simplement écrire un "littéral" avec ces données? – dan04

+2

Quelle est votre question? Voulez-vous * stocker * ou * analyser * ces données? – Philipp

Répondre

5

Si vous pouvez avoir des noms en double, vous ne pouvez pas utiliser une carte, de sorte que vous pouvez utiliser quelque chose comme ceci:

struct Person 
{ 
    Person(const std::string & n, int v) : name(n), val(v) {} 
    std::string name; 
    int val; 
}; 

int main() 
{ 
std::vector<Person> people; 

people.push_back(Person("Jeff", 0)); 
people.push_back(Person("Jill", 1)); 
... 

} 

Si vous vouliez l'unicité des noms que vous pourriez faire quelque chose comme ceci:

std::map<std::string, int> people; 
people["Jeff"] = 0; 
people["Jill"] = 1; 

ou

std::map<std::string, Person> people; 
people["Jeff"] = Person("Jeff",0); 
people["Jill"] = Person("Jill",1); 

Si vous utilisez ce code beaucoup, vous pouvez nettoyer les cochonneries répétées.

template<typename K, typename V> 
struct BuildMap 
{ 
    BuildMap() : map_() {} 
    BuildMap<K,V>& operator()(const K & key, const V & value) 
    { 
    map_[key]=value; 
    return *this; 
    } 
    std::map<K,V> operator()() { return map_; } 
    std::map<K,V> map_; 
}; 

std::map<std::string,int> people = BuildMap<std::string,int>() 
    ("Jeff", 0) 
    ("Jill", 1) 
    ("John", 1) 
(); 

Espérons que cela vous donne quelques idées.

+1

Ou simplement utiliser Boost.Assign pour une initialisation simplifiée. –

+0

@Georg: Bibliothèque impressionnante, recherchant quelque chose comme ça depuis des lustres. Un autre utilitaire utile boost. Voici le lien: http://www.boost.org/doc/libs/1_43_0/libs/assign/doc/index.html –

+0

Belle classe 'BuildMap'! +1 – Linuxios

0

Essayez de regarder std :: map.

lien

ici http://www.cplusplus.com/reference/stl/map/

Il est un conteneur associatif qui est similaire à un dictionnaire. Quelque chose comme ça?

#include <map> 
#include <string> 

std::map<string,int> person; 

void initPeople(){ 
    person["Jeff"] = 0; 
    person["Jill"] = 1; 
    person["Jack"] = 0; 
    person["Jim"] = 1; 
    person["John"] = 0; 
} 
+1

Cela suppose que les noms sont uniques et que l'ordre d'origine n'a pas d'importance. L'OP ne l'a pas spécifié. – dan04

+0

Les noms sont uniques, l'ordre n'a pas d'importance. J'ai juste besoin de l'écrire manuellement et d'y accéder par un nombre aléatoire - par ex. Renvoie people.person [rndnumber] .name et renvoie people.person [NOTrndnumber] .val. –

4

Jetez un oeil à jsoncpp - il est un analyseur de JSON léger, qui le rend très facile à utiliser JSON dans votre C++ projet.

http://sourceforge.net/projects/jsoncpp/

Ensuite, vous pouvez créer un fichier texte, écrire quelques entrées dans le format JSON là-bas et puis ouvrez ce fichier dans votre C++ programme. Il y a beaucoup de tutoriels sur la façon de le faire avec jsoncpp.

+0

Ça a l'air génial, mais je crains trop en C++ donc je n'ai aucune idée de comment l'utiliser/implémenter. J'ai juste besoin d'un tableau (?) De plus de 300 mots et valeurs uniques (1 ou 0 ==> vrai/faux) et être capable d'y accéder facilement. Dans JS c'est tellement facile - il suffit de créer un objet et d'y accéder par people.person [X] .name ... Mais merci pour votre suggestion. :) –

Questions connexes