Conversion de classe C ++ en JSON

J’aimerais créer une chaîne JSON contenant les variables d’instance de ma classe.

Par exemple,

class Example { std::ssortingng ssortingng; std::map map; std::vector vector; }; 

deviendrait:

 { "ssortingng":"the-ssortingng-value", "map": { "key1":"val1", "key2":"val2" }, "vector":[1,2,3,4] } 

J’ai examiné plusieurs bibliothèques C ++ pour créer JSON et elles semblent toutes incroyablement complexes. Je voudrais quelque chose de similaire à JSON.ssortingngify(object) de Javascript. En d’autres termes, passez simplement un std :: map et recevez une chaîne. La carte peut contenir d’autres cartes, vecteurs, listes, chaînes, nombres et bools.

Quelle est la meilleure façon de faire cela?

Merci de votre aide.

modifier

J’ai examiné les points suivants:

json spirit, jsoncpp, zoolib, JOST, CAJUN, libjson, nosjob, JsonBox, jsonme–

Ce que je comprends, je peux construire un object JSON séparé comme dans une réponse ci-dessous et convertir en JSON J’aimerais pouvoir stocker mes données dans des collections standard et les convertir.

Modifier 2

Ok, renoncez à l’idée de sérialiser une classe car il semble impossible avec le manque de reflection de C ++.

Existe-t-il un bon moyen de convertir un fichier std :: map contenant std: maps, std :: vectors, std :: lists, numbers, ssortingngs et bools en JSON sans avoir à modifier les types de données ou à copier les données dans un nouveau type de données?

Merci.

JSON Spirit vous permettrait de le faire ainsi:

 Object addr_obj; addr_obj.push_back( Pair( "house_number", 42 ) ); addr_obj.push_back( Pair( "road", "East Street" ) ); addr_obj.push_back( Pair( "town", "Newtown" ) ); ofstream os( "address.txt" ); write( addr_obj, os, pretty_print ); os.close(); 

Sortie:

 { "house_number" : 42, "road" : "East Street", "town" : "Newtown" } 

Le json_map_demo.cpp serait un bon endroit pour commencer, je suppose.

Toute bonne bibliothèque JSL C ++ devrait le faire et il est sortingste de voir qu’ils ne le font pas – à l’exception de ThorsSerializer et apparemment de Nosjob comme mentionné dans cette question .

Bien sûr, C ++ n’a pas de reflection comme Java, vous devez donc annoter explicitement vos types:
(copié à partir de la documentation ThorsSerializer)

 #include "ThorSerialize/JsonThor.h" #include "ThorSerialize/SerUtil.h" #include  #include  #include  #include  class Example { std::ssortingng ssortingng; std::map map; std::vector vector; // Allow access to the class by the serialization library. friend class ThorsAnvil::Serialize::Traits; public: Example(std::ssortingng const& s, std::map const& m, std::vector const& v) : ssortingng(s), map(m), vector(v) {} }; // Define what members need to be serilizable ThorsAnvil_MakeTrait(Example, ssortingng, map, vector); 

Exemple d’utilisation:

 int main() { using ThorsAnvil::Serialize::jsonExport; using ThorsAnvil::Serialize::jsonImport; Example e1 {"Some Text", {{"ace", "the best"}, {"king", "second best"}}, {1 ,2 ,3, 4}}; // Simply serialize object to json using a stream. std::cout << jsonExport(e1) << "\n"; // Deserialize json text from a stream into object. std::cin >> jsonImport(e1); } 

Fonctionnement:

 { "ssortingng": "Some Text", "map": { "ace": "the best", "king": "second best" }, "vector": [ 1, 2, 3, 4] } 

Vous ne pouvez pas faire mieux que cela en C ++.

J’ai écrit une bibliothèque pour résoudre votre problème. Cependant, c’est un projet très nouveau, pas assez stable. N’hésitez pas à jeter un coup d’oeil, la page d’accueil est ici ::

https://github.com/Mizuchi/acml

Dans votre exemple, vous devez append une ligne comme celle-ci:

 ACML_REGISTER(Example, ,(ssortingng)(map)(vector)); 

afin de dire à la bibliothèque quel membre vous souhaitez vider. Puisque C ++ n’a pas de reflection. Et vous devez donner un moyen d’accéder au membre, soit utiliser le niveau membre public ou utiliser la classe ami.

Et plus tard, il suffit de faire ça comme ça:

ssortingng result = acml :: json :: dumps (any_object);

deviendrait::

 { "ssortingng": "the-ssortingng-value", "map": { "key1": "val1", "key2": "val2" }, "vector": { "type": "std::vector", "size": "4", "0": "1", "1": "2", "2": "3", "3": "4" } } 

Comme vous le voyez, le tableau JSON n’est pas encore implémenté. Et tout devient chaîne maintenant.

Voulez-vous JSON-ify une carte ou un object? (votre exemple montre une classe, mais vous dites une carte). Pour une carte, consultez cette bibliothèque – JSON Spirit .

Pour les objects: il n’y a pas de support de reflection en C ++ (hormis le RTTI très limité), il n’y a donc pas de solution “en un clic” pour la sérialisation. Toute solution nécessite que vous écriviez du code supplémentaire éventuellement couplé à la classe que vous souhaitez sérialiser et désérialiser (cela dépend si vous souhaitez sérialiser des données non publiques).

Avez-vous regardé les céréales ( http://uscilab.github.io/cereal/ )? Il a des archives JSON pour la sérialisation vers / depuis JSON en utilisant C ++.

Un exemple avec un minimum de frais généraux (de céréales) peut être trouvé ici sur SO: https://stackoverflow.com/a/22587527/255635

J’ai écrit une bibliothèque expérimentale qui peut faire le travail, mais elle nécessite une description externe des structures de classes et de la hiérarchie. Il utilise GCCXML pour créer un dictionnaire xml, utilisé pour la désérialisation de la sérialisation:

http://code.google.com/p/cjson/

C’est pour le moment un projet expérimental, capable de traiter des types fondamentaux (int, double float), des pointeurs vers des types fondamentaux, des classes, des membres hérités, etc. Il implémente la sérialisation std :: vector ans std :: map, et aussi std :: ssortingng instances.

Voir les détails pour la mise en œuvre ici

ce script python génère des classes de pod c ++ avec un membre pour chaque propriété json

vous voulez tout à fait le contraire, mais est sortingvial pour générer une classe de cartographie qui fait à la fois le chargement et la sauvegarde

le code généré repose sur une bibliothèque externe d’parsing syntaxique JSON

Si la question est toujours d’ actualité , alors regardez la bibliothèque json_dto , une petite aide en-tête uniquement pour convertir les données entre la représentation JSON et les structures c ++.

Par exemple, avoir les structures suivantes:

 struct message_source_t { // Worker thread. std::int32_t m_thread_id; // Sender. std::ssortingng m_subsystem; }; struct message_t { // Who sent a message. message_source_t m_from; // When the message was sent (unixtime). std::tm m_when; // Message text. std::ssortingng m_text; }; 

Avec l’aide de json_dto, vous pouvez créer le JSON suivant:

 { "from" : { "thread_id" : 4242, "sybsystem" : "json_dto" }, "when" : "2016.09.28 19:55:00", "text" : "Hello world!" } 

Et étant donné une telle chaîne JSON, vous pouvez la convertir en structures.