La conversion de C++ de la classe JSON
J'aimerais créer une chaîne JSON contenant les variables d'instance de ma classe.
Par exemple,
class Example {
std::string string;
std::map<std::string, std:string> map;
std::vector<int> vector;
};
devient:
{
"string":"the-string-value",
"map": {
"key1":"val1",
"key2":"val2"
},
"vector":[1,2,3,4]
}
J'ai regardé dans plusieurs bibliothèques C++ pour la création de JSON et ils ont tous l'air incroyablement complexe. J'aimerais quelque chose de semblable à du Javascript JSON.stringify(object)
. En d'autres mots, il suffit de passer un std::map, et obtenir une chaîne de caractères. La carte peut contenir d'autres cartes, des vecteurs, des listes, des chaînes, des nombres et des booléens.
Quelle est la meilleure façon de le faire?
Merci pour votre aide.
Modifier
J'ai regardé dans les éléments suivants:
json esprit, jsoncpp, zoolib, JOST, CAJUN, libjson, nosjob, JsonBox, jsonme--
Que je comprends, je peux construire un distinct objet JSON comme dans la réponse ci-dessous et de le convertir en JSON, je voudrais être en mesure de stocker mes affaires dans la norme des collections et de les convertir.
Edit 2
Bon, de la ferraille, l'idée de sérialisation d'une classe car il semble que c'est impossible avec le C++de manque de réflexion.
Est là une belle façon de convertir un std::map contenant std:cartes, std::vecteurs, std::des listes, des nombres, des chaînes et des booléens en JSON sans avoir à modifier les types de données ou de copier des données sur un nouveau type de données?
Grâce.
- Qui bibliothèques avez-vous regardé? Donc, nous savons ce que vous trouvez complexes
- Voir stackoverflow.com/questions/245973/whats-the-best-c-json-parser et stackoverflow.com/questions/6538725/... (maintenant supprimé; 10k+ uniquement)
- J'ai mis à jour mon post. La complexité vient à avoir besoin de faire beaucoup de travail à faire quelque chose que je m'attends à être très simple. J'ai vraiment l'impression que je manque quelque chose, peut-être quelque chose d'évident.
- Vous ne manquez de rien, ce n'est pas possible en C++ (dans la forme comme vous l'avez décrit).
- Vous pouvez aller sur ce de la mauvaise façon. Cette "seulement" classes devrait probablement être un
std::tuple
; et vous devriez être en mesure de monter quelques modèles de l'action à la sortie d'une représentation JSON d'un tuple assez facilement. - Ce n'est pas un seulement des données de la classe, j'ai juste donné un exemple avec uniquement des données. Désolé. Une solution pour convertir un std::map contenant std::cartes, std::listes, std::les vecteurs, les numéros et les booléens en JSON serait bien aussi.
- Il y a des bibliothèques qui peuvent le faire à l'aide d'adaptateurs. Voir cette réponse: stackoverflow.com/a/19957475/214777
- Le même problème se présente à moi aujourd'hui. Espérons qu'il aide les stackoverflow.com/questions/26773043/...
Vous devez vous connecter pour publier un commentaire.
JSON Esprit vous permettra de le faire de la sorte:
De sortie:
La json_map_demo.cpp serait un bon endroit pour commencer, je suppose.
Tout bon C++ librairie JSON doit le faire, et c'est triste de voir qu'ils ne sont pas, à l'exception de ThorsSerializer et apparemment Nosjob comme mentionné dans ce question.
Bien sûr, C++ n'a pas de réflexion, comme Java, de sorte que vous devez explicitement d'annoter vos types:
(copié à partir de la ThorsSerializer documentation)
Exemple D'Utilisation:
En cours d'exécution:
Vous ne pouvez pas faire mieux que cela en C++.
J'ai écrit une bibliothèque qui est conçu pour résoudre votre problème.
Cependant, elle est un tout nouveau projet, 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 ajouter une ligne comme ceci:
pour raconter la bibliothèque de membre que vous voulez sauvegarder.
Depuis C++ ont pas de reflet.
Et vous devez fournir un moyen d'accès du membre,
soit utiliser du public au niveau des membres ou de l'utilisation amie de classe.
Et, plus tard, vous avez juste besoin de faire qqch comme ceci:
string result = acml::json::dumps(any_object);
deviendrait::
Comme vous le voyez, tableau JSON n'est pas encore mis en œuvre.
Et tout devient de la chaîne de maintenant.
Voulez-vous JSON-identifier une carte ou un objet? (votre exemple montre une classe, et pourtant vous dire une carte). Pour une carte, découvrez cette bibliothèque - JSON Esprit.
Pour les objets: Il n'y a pas de réflexion de soutien en C++ (en dehors de la très limitée RTTI), donc il n'y a pas de "-cliquez sur" solution " pour la sérialisation soit. Toute solution va vous obliger à écrire d'autres, éventuellement couplés code de la classe que vous souhaitez pour sérialiser et désérialiser (cela dépend si vous souhaitez sérialiser non publiques de données).
Avez-vous regardé les céréales (http://uscilab.github.io/cereal/) ? Il a JSON archives pour la sérialisation/à partir de JSON à l'aide de C++.
Un exemple avec un minimum de frais généraux (pour les céréales) peuvent être trouvés ici sur DONC: https://stackoverflow.com/a/22587527/255635
J'ai écrit un dispositif expérimental de la bibliothèque qui peut faire le travail, mais il nécessite de la description externe des classes de structures et de la hiérarchie. Il utilise GCCXML de construire un dictionnaire xml, utilisé pour la sérialisation de-la sérialisation :
http://code.google.com/p/cjson/
C'est pour le moment un projet expérimental, qui peuvent traite de types fondamentaux (int, float double), des pointeurs vers les fondamentaux types, les classes, les membres hérités etc ... Il implémente la base std::vector sna std::map de la sérialisation, et également std::string instances.
Voir les détails de la mise en œuvre ici
Vous pouvez utiliser Coup de pouce.PropertyTree.
De sortie:
cette script python génère pod c++ classes avec un membre de chaque json propriété
vous voulez tout à fait le contraire, mais il est trivial de générer une cartographie de la classe qui ne le chargement et la sauvegarde
code généré s'appuie sur un externe json parser
Si la question est toujours d'actualité, puis regarder json_dto bibliothèque, un petit en-tête uniquement aide pour la conversion de données entre la représentation JSON et c++ structures.
Par exemple les structures suivantes:
avec l'aide de json_dto vous pouvez créer le JSON suivants:
Et donné une telle chaîne JSON, vous pouvez convertir des structures.