Récupération d'un objet imbriqué à l'intérieur d'une chaîne JSON à l'aide de rapidjson
J'ai besoin de récupérer un objet imbriqué à l'intérieur d'une chaîne JSON et je suis en train de le faire en utilisant rapidjson. Tout ce que j'ai trouvé est de savoir comment récupérer des tableaux et des types de base, mais pas de sous-objets. J'ai créé le jouet exemple qui donne une erreur:
rapidjson::Document document;
std::string test = " { \"a\": { \"z\" : 21 } } ";
std::cout << test << std::endl;
if ( document.Parse<0>( test.c_str() ).HasParseError() ) {
std::cout << "Parsing error" << std::endl;
} else {
if ( document[ "a" ].IsObject() ) {
std::cout << "OK" << std::endl;
std::cout << document[ "a" ].GetString() << std::endl;
}
}
C'est la sortie lors de l'exécution:
{ "a": { "z" : 21 } }
OK
JSONTest: ../rapidjson/document.h:441: const typename Encoding::Ch* rapidjson::GenericValue<Encoding, Allocator>::GetString() const [with Encoding = rapidjson::UTF8<char>, Allocator = rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>]: Assertion `IsString()' failed. Aborted
Comment puis-je récupérer l'objet interne pour continuer mon analyse? Merci.
Modifier: Ce dont j'ai besoin est d'obtenir la représentation de chaîne de l'objet interne donc je peut en appeler une autre fonction qui va l'analyser.
Edit 2: le code qui permet de récupérer l'objet interne comme une chaîne de caractères:
rapidjson::Document document;
std::string test = "{\"a\":{\"z\":21}} ";
if ( document.Parse<0>( test.c_str() ).HasParseError() ) {
std::cout << "Error parsing" << std::endl;
} else {
if ( document[ "a" ].IsObject() ) {
rapidjson::StringBuffer sb;
rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
document[ "a" ].Accept( writer );
std::cout << sb.GetString() << std::endl;
}
}
Ça veut dire que RapidJson ne prend pas en charge les objets hiérarchiques? alors qu'à analyser le niveau de la racine?!?!
OriginalL'auteur pparescasellas | 2012-10-05
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de parcourir l'objet de membres manuellement, comme GetString() ne fonctionne que sur la chaîne de membres, tandis que le document["un"] est un Objet. Vous devez parcourir que de l'objet de membres à l'aide de MemberIterator variable. Je n'avais aucune pratique en C* pour plus de 15 ans, donc je ne peut donner une idée générale de la façon dont il devrait fonctionner:
Aussi, vous voudrez peut-être regarder à la méthode Accept (), il semble renvoyer une chaîne JSON d'un objet, vous le donner.
OriginalL'auteur Vesper
Si l'élément est un objet que vous pouvez accéder sous-propriétés avec []:
OriginalL'auteur lasote
Il ya une autre grande approche réalisée en rapidjson - JSON Pointeurs. Ils ont de la situation expérimentale et selon la documentation doit être inclus dans v. 1.1. De toute façon cette approche ressemble XPATH pour XML, de sorte à obtenir imbriquée valeur, nous pouvons utiliser la syntaxe comme
J'ai essayé cette fonctionnalité et à mon avis c'est mieux que les itérateurs.
OriginalL'auteur Kostia Shiian
Vous pouvez utiliser un pointeur pour obtenir le sous-objet:
OriginalL'auteur Michael
Voici un exemple de code pour obtenir l'objet imbriqué comme
rapidjson::Document
objet.OriginalL'auteur RealityPC
vous pouvez également utiliser le pointeur de Document:
et la mise en Valeur du pointeur et l'utiliser
OriginalL'auteur Shubham Trigunait
C'est quelque chose que j'ai récemment travaillé sur:
Ce peut gérer n'importe quel type de JSON arbre. Tout ce que vous avez à faire est de passer une Valeur en tant que telle:
Et vous avez terminé!
J'ai regardé sur internet pour toujours pour cela et je ne pouvais pas le trouver. Juste essayer de vous aider. Calmer
OriginalL'auteur a.raya203