IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Manipulation d'arrays avec Boost Spirit


Sujet :

Boost C++

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 31
    Par défaut Manipulation d'arrays avec Boost Spirit
    Bonjour a tous et désolé de vous embêter de nouveau avec Json Boost Spirit.
    Je me sers du simple JSON suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
       Test :[
               {
                   "String1" : "value1",
                   "String2" : "value2"
               },
               {
                   "String3" : "value3",
                   "String4" : "value4"
               }
           ]
    }
    et j'aimerais accéder aux valeurs "value" mais je ne maitrise absolument pas la manipulation d'array.
    J'y arrive lorsque Test est un objet contenant les deux objets ci dessus mais pas quand c'est un tableau contenant ces deux objets.

    Les tutos sur JSON Boost Spirit ne sont pas vraiment nombreux
    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour,

    http://www.boost.org/doc/libs/1_53_0...rs.json_parser

    Ne serait pas plus simple si tu veux parser du JSON ? A la place de réécrire le parser ?

  3. #3
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Boost PropertyTree n'est pas un parser JSON.

    Gravez vous ca dans le crane. Boost.Property ptree est un arbre de propriete C++, point, barre. Il a une fonction de serialization vers le format JSON, et d'autres vers divers format. MAIS le format des donnees lui meme n'est pas completement compatible avec JSON.

    Du coup, si on veut vraiment parser du JSON CE N'EST PAS DU TOUT UNE BONNE SOLUTION. En particulier, essayez de placer une valeur nulle dans le JSON, vous allez etre surpris. Il y a d'autres subtitlites comme ca, parceque Boost.PropertyTree n'est pas mappe sur le JSON, il est mape sur un principe d'arbre avec des proprietes, et theoriquement on peut s'en sortir pour en faire du xml ou du json, mais ca veut pas dire que ca gere tout xml ou tout json.

    Bref, tout ca pour dire qu'il y a un projet pour refactorer l'exemple de parseur complet JSON dans Boost.Spirit en un projet particulier. Sinon il y a http://jsoncpp.sourceforge.net/ et mieux: http://www.codeproject.com/Articles/...or-Implemented

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu as un exemple de JSON qui ne "marche" pas ? Parce que je vois pas trop le problème avec null (et oui j'ai testé), ça va demander de faire attention lors de l'utilisation à cause de l'absence de typage, mais le parsage est fait.

    Edit: Et j'ai pas dit que boost::property_tree était un parser de JSON, je l'ai donné car il offre une structure de donnée et différents parser de format (dont JSON) pour la remplir.

  5. #5
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Tu as un exemple de JSON qui ne "marche" pas ? Parce que je vois pas trop le problème avec null (et oui j'ai testé), ça va demander de faire attention lors de l'utilisation à cause de l'absence de typage, mais le parsage est fait.
    Tu as teste et tu as eu un truc comme ca?

    ou comme ca?

    Sinon jettes un oeil la: http://stackoverflow.com/questions/2...it-possible-to

    Il y a plusieurs cas mais en gros certaines valeurs non representable en ptree le sont en JSON.

    Le souci si tu veux (et qui rends la comprehension de l'utilite de ptree ambigue) c'est que si tu fais par exemple une application web, alors tu as besoin de parser du JSON dans la totalite du language, en particulier si le JSON viens de l'exterieur. Dans ce cas la, ptree est reellement inutilisable (je m'y suis casse les dents il y a deux ans) et n'importe quelle bibliotheque implementant JSON complement est adequate.

    Le seul cas ou ptree est pertinent avec JSON c'est si c'est pour que l'applications sortes du JSON a partir du ptree, et que l'application ne lise pas de JSON qui vienne d'une autre application qui elle peut ecrire du JSON valide plus complet que ce que propose ptree.

    A mon avis, des le moment ou on a besoin de JSON en particulier, il faut oublier ptree. Si on utilise ptree, c'est plus pour utilser ptree et eventuellement sortir du JSON parceque c'est facile a lire. Si on veut du JSON pour manipuler du JSON reellement, ne pas utiliser ptree.

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    J'ai testé la lecture pas l’écriture, mais oui il y a un problème lié au typage (puisqu'il va tout parser comme dans des std::string). Et j'avais pas fait attention sur le coup, mais il est possible qu'il y ai un problème pour faire le choix entre "null" et null.

    Je ne sais pas ce que cherche à faire exactement l'OP, mais si il n'a pas besoin d'une telle différenciation, le parser proposé par Ptree suffit (même si la représentation issue du parser n'est effectivement pas parfaire pour représenter le JSON). D'autre part, en regardant le code du parser de Ptree on peut faire deux choses :
    • Se baser dessus pour écrire un parser complet. Ça demande de connaitre boost::spirit, mais ça simplifie énormément le travail (il est fait pour tout parser vers le même type, c'est ça qu'il faut changer, c'est à dire introduire un boost::variant, et corriger les actions associé au règles du parsage pour aller vers les bon types (*)).
    • Regarder de plus près pour voir si il n'est pas possible de définir un type (autre que std::string) qui va profiter des syntaxes de constructions utilisé par le parser pour déterminer la nature de ce qui est parser.


    NB: C'est écrit dans la doc que tout est parser dans des chaines de caractères directement.

    PS: Ça n'enlève rien à la pertinence des bibliothèques que tu suggères pour parser du JSON directement comparé à ce que je propose.

  7. #7
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Oui en fait milene31 selon si tu veux vraiment parser n'importe quel type de JSON ou juste des strings (dont les valeurs peuvent etre convertis via lexical_cast une fois dans le C++), alors tu vas avoir besoin d'une solution differente.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 31
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Boost PropertyTree n'est pas un parser JSON.

    Gravez vous ca dans le crane. Boost.Property ptree est un arbre de propriete C++, point, barre. Il a une fonction de serialization vers le format JSON, et d'autres vers divers format. MAIS le format des donnees lui meme n'est pas completement compatible avec JSON.

    Du coup, si on veut vraiment parser du JSON CE N'EST PAS DU TOUT UNE BONNE SOLUTION. En particulier, essayez de placer une valeur nulle dans le JSON, vous allez etre surpris. Il y a d'autres subtitlites comme ca, parceque Boost.PropertyTree n'est pas mappe sur le JSON, il est mape sur un principe d'arbre avec des proprietes, et theoriquement on peut s'en sortir pour en faire du xml ou du json, mais ca veut pas dire que ca gere tout xml ou tout json.

    Bref, tout ca pour dire qu'il y a un projet pour refactorer l'exemple de parseur complet JSON dans Boost.Spirit en un projet particulier. Sinon il y a http://jsoncpp.sourceforge.net/ et mieux: http://www.codeproject.com/Articles/...or-Implemented
    Merci pour vos réponses et explication. J'ai bel et bien utilisé le deuxième lien que tu me donnes.
    Mais celui ci ne donne pas d'exemple concret sur la récupération d'une valeur dans un tableau ou liste.

    Et en effet pour Boost.Property ptree cela ne me sera pas utile car du JSON viendra de l'extérieur

  9. #9
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Citation Envoyé par milene31 Voir le message
    Mais celui ci ne donne pas d'exemple concret sur la récupération d'une valeur dans un tableau ou liste.
    Ben si c'es explique la:
    A top level Value read from a file or stream normally contains an Array or an Object. An Array is a std::vector of values. An Object is, by default, a std::vector of JSON pairs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef std::vector< Pair > Object;
    typedef std::vector< Value > Array;
    A Pair is a structure that holds a std::string and a Value.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Pair
    {
        Pair( const std::string& name, const Value& value );
     
        bool operator==( const Pair& lhs ) const;
     
        std::string name_;
        Value value_;
    };
    JSON Arrays and Objects can themselves contain other Arrays or Objects, forming a tree.

    Note, JSON Spirit provides an alternative std::map based Object; see the Map Implementation section below. In this case, a Pair type is not needed as an mObject is a std::map of names to values.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::map< std::string, mValue > mObject;
    Donc tu as juste a faire recuperer la Value et utiliser get_array() ou get_object() et ensuite parcourir puisque ce sont des conteneurs standard...

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 31
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Ben si c'es explique la:

    Donc tu as juste a faire recuperer la Value et utiliser get_array() ou get_object() et ensuite parcourir puisque ce sont des conteneurs standard...
    Ce qui correspond a mon JSON d'exemple est un string appelé test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mValue value;
    read(test, value);
     
    ??? = value.get_array();
    A la place de "???" j'ai beau mettre object, array, string .. J'ai une erreur de détectée.

    EDIT : cela fonctionne avec mArray readArray;
    readArray = value.get_array();

    Mais après je ne vois pas comment naviguer dans ce readArray pour récupérer les deux objets ..

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 31
    Par défaut
    En reprenant de zero tout fonctionne aussi facilement qu'explique sur le site de JSON Spirit ..
    On recupere l'objet avec un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Object obj;
    Array test;
    obj = test[0].get_obj();
    Et ensuite on traite notre nouvel objet .. Désolé pour la perte de temps, je ne comprend pas pourquoi cela n'a pas marche des le début.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parseur de multiple affectation (avec Boost.Spirit)
    Par Trademark dans le forum Langage
    Réponses: 5
    Dernier message: 16/07/2012, 19h20
  2. Réponses: 3
    Dernier message: 30/04/2012, 12h21
  3. boost spirit (pb avec les espaces)
    Par amirabg dans le forum Boost
    Réponses: 6
    Dernier message: 16/02/2010, 23h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo