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

C++ Discussion :

JsonCpp : une nouvelle bibliothèque pour analyser le JSON en C++11


Sujet :

C++

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut JsonCpp : une nouvelle bibliothèque pour analyser le JSON en C++11
    JsonCpp : une nouvelle bibliothèque pour analyser le JSON en C++11


    JsonCpp est une énième bibliothèque pour analyser le JSON en C++ sous licence MIT. Toutefois, malgré le côté déjà vu de celle-ci, vous pourriez être intéressé par JsonCpp pour :
    • son utilisation du C++11 ;
    • sa disponibilité en bibliothèque complètement implémentée dans les fichiers d'entêtes.


    Autrement, celle-ci apporte les fonctionnalités habituelles permettant d'analyser les entrées au format JSON :
    • lire et écrire des données au format JSON ;
    • sérialisation/désérialisation ;
    • attacher des commentaires C++ aux éléments durant l'analyse ;
    • réécrire le document JSON en gardant les commentaires originaux.


    Voici un exemple de code utilisant JsonCpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Json::Value root;   // 'root' will contain the root value after parsing.
    std::cin >> root;
    // You can also read into a particular sub-value.
    std::cin >> root["subtree"];
    // Get the value of the member of root named 'encoding',
    // and return 'UTF-8' if there is no such member.
    std::string encoding = root.get("encoding", "UTF-8" ).asString();
    // Get the value of the member of root named 'plug-ins'; return a 'null' value if
    // there is no such member.
    const Json::Value plugins = root["plug-ins"];
    // Iterate over the sequence elements.
    for ( int index = 0; index < plugins.size(); ++index )
       loadPlugIn( plugins[index].asString() );
     
    // Try other datatypes. Some are auto-convertible to others.
    foo::setIndentLength( root["indent"].get("length", 3).asInt() );
    foo::setIndentUseSpace( root["indent"].get("use_space", true).asBool() );
    // Since Json::Value has an implicit constructor for all value types, it is not
    // necessary to explicitly construct the Json::Value object.
    root["encoding"] = foo::getCurrentEncoding();
    root["indent"]["length"] = foo::getCurrentIndentLength();
    root["indent"]["use_space"] = foo::getCurrentIndentUseSpace();
    // If you like the defaults, you can insert directly into a stream.
    std::cout << root;
    // Of course, you can write to `std::ostringstream` if you prefer.
    // If desired, remember to add a linefeed and flush.
    std::cout << std::endl;
    Vous pouvez retrouver le projet sur GitHub.



    Pour rappel, voici un exemple de données au format JSON :
    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
        "encoding" : "UTF-8",
        "plug-ins" : [
            "python",
            "c++",
            "ruby"
            ],
        "indent" : { "length" : 3, "use_space": true }
    }



    Votre opinion

    Quelle bibliothèque utilisez-vous pour analyser les entrées au format JSON ?
    De quelles fonctionnalités avez-vous absolument besoin dans ce type de bibliothèques ?


    Source

    GitHub
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Super ! C'est une bonne nouvelle un peu de renouveau en C++ 11 pour lire/écrire du JSON car c'est pas forcément user friendly.

    Je valide cette news et je m'en vais tester.

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    La première release de jsoncpp datent de 2010, mais peut être vient elle effectivement de passer au c++11. Je lai utilisé il y'a quelques mois et l'ai finalement abandonné pour rapidjson (header only également) bien plus performante.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Points : 118
    Points
    118
    Par défaut
    J'ai pas trouvé de doc en ligne... Y'a que la doc doxygen (mais pas envi de télécharger le projet juste pour voir la doc).

    J'ai utilisé RapidJson aussi, mais je trouve que cette bibliothèque a un très grand défaut : les fonctions commencent par des majuscule (WTF???). Du coup, impossible d'utiliser les boucles for each, impossible d'utiliser les std::stream. Bref, une incompatibilité complète avec le C++11 standard.

    Ensuite j'ai découvert celle-ci qui fonctionne plutôt bien : https://github.com/nlohmann/json
    Après niveau performance, j'ai pas fait de tests. Je m'en sers pour charger des confs au lancement des programmes. Donc la performance impacte peu.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Vinorcola Voir le message
    un très grand défaut : les fonctions commencent par des majuscule (WTF???). Du coup, impossible d'utiliser les boucles for each, impossible d'utiliser les std::stream. Bref, une incompatibilité complète avec le C++11 standard.
    Euh.. gni ??? Je vois pas le rapport.

    @grunk : donc rapidjson porte encore bien son nom ? bon à savoir
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre régulier
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Euh.. gni ??? Je vois pas le rapport.
    La boucle for each utilise les fonctions begin & end. RapidJson a eu la très bonne idée de les appeler Begin et End. Du coup, ça passe pas.
    L'écriture utilise la fonction Flush alors que les std::stream ont une fonction flush.
    J'imagine qu'il doit y avoir d'autres incompatibilités de la sorte, mais pour le moment, je n'ai trouver que ces 2 points là, qui étaient bloquants pour moi du coup

    Bref avant d'utiliser des conventions de nommage un peu farfelu, il faut penser à ce que ça implique derrière...

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Vinorcola Voir le message
    La boucle for each
    Tu parles probablement de range-based for loops?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Membre régulier
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Points : 118
    Points
    118
    Par défaut
    Je parles de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (const auto& child : collection)
    {
        ...
    }
    Après, je ne connais pas forcément le nom officiel ^^

  9. #9
    Expert confirmé Avatar de AoCannaille
    Inscrit en
    Juin 2009
    Messages
    1 413
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 1 413
    Points : 4 734
    Points
    4 734
    Par défaut
    Citation Envoyé par Vinorcola Voir le message
    La boucle for each utilise les fonctions begin & end. RapidJson a eu la très bonne idée de les appeler Begin et End. Du coup, ça passe pas.
    L'écriture utilise la fonction Flush alors que les std::stream ont une fonction flush.
    J'imagine qu'il doit y avoir d'autres incompatibilités de la sorte, mais pour le moment, je n'ai trouver que ces 2 points là, qui étaient bloquants pour moi du coup

    Bref avant d'utiliser des conventions de nommage un peu farfelu, il faut penser à ce que ça implique derrière...
    Tes préoccupations paraissent légitimes, hésite pas à en parler sur le github, voire même d'ajouter tes fonctions avec la bonne casse et de le reproposer au créateur.

  10. #10
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par Vinorcola Voir le message
    La boucle for each utilise les fonctions begin & end. RapidJson a eu la très bonne idée de les appeler Begin et End. Du coup, ça passe pas.
    L'écriture utilise la fonction Flush alors que les std::stream ont une fonction flush.
    J'imagine qu'il doit y avoir d'autres incompatibilités de la sorte, mais pour le moment, je n'ai trouver que ces 2 points là, qui étaient bloquants pour moi du coup

    Bref avant d'utiliser des conventions de nommage un peu farfelu, il faut penser à ce que ça implique derrière...
    J'ai du mal à voir / comprendre le conflit
    - C++ est sensible à la casse
    - les fonctions de la bibliothèque standard ne sont pas begin, end et flush mais std::begin, std::end et std::flush

  11. #11
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    J'ai du mal à voir / comprendre le conflit
    Les boucle for-range ne fonctionnent pas alors que les fonctions d'itérateur existent. Mais sous un autre nom.

    Citation Envoyé par Ehonn Voir le message
    - les fonctions de la bibliothèque standard ne sont pas begin, end et flush mais std::begin, std::end et std::flush
    Pourtant, il ne faudrait pas précéder par std:: les fonctions utilitaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    namespace kk {
      struct MonRange {
        struct iterator { /*...*/ };
        iterator Begin();
        iterator End();
      };
     
      MonRange::iterator begin(MonRange & r) { return r.Begin(); }
      MonRange::iterator end(MonRange & r) { return r.End(); }
    }
    //...
     
    std::vector<int> v;
    kk::MonRange r;
    int a[2];
     
    for (auto x : v) {} // ok
    for (auto x : r) {} // ok
    for (auto x : a) {} // ok
     
    // dépendant du namespace
    std::for_each(std::begin(v), std::end(v), blahblah); // ok
    std::for_each(kk::begin(r), kk::end(r), blahblah); // ok
    std::for_each(std::begin(a), std::end(a), blahblah); // ok
     
    // avec std::
    std::for_each(std::begin(v), std::end(v), blahblah); // ok
    std::for_each(std::begin(r), std::end(r), blahblah); // pas ok
    std::for_each(std::begin(a), std::end(a), blahblah); // ok
     
    // sans std::
    std::for_each(begin(v), end(v), blahblah); // ok
    std::for_each(begin(r), end(r), blahblah); // ok
    std::for_each(begin(a), end(a), blahblah); // pas ok
     
    // la bonne manière de faire
     
    using std::begin;
    using std::end;
     
    std::for_each(begin(v), end(v), blahblah); // ok
    std::for_each(begin(r), end(r), blahblah); // ok
    std::for_each(begin(a), end(a), blahblah); // ok
    Histoire que mes écris servent:
    Utilisation de swap et des fonctions utilitaires
    Délégation d'appel de fonctions utilitaires

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour.

    Citation Envoyé par LittleWhite Voir le message
    Quelle bibliothèque utilisez-vous pour analyser les entrées au format JSON
    Perso j'utilise json_spirit.
    Ça fait le taf, c'est du c++11, c'est full template, mais je ne sais pas si c'est mieux que les autres car je n'ai jamais comparé.

    Citation Envoyé par LittleWhite Voir le message
    De quelles fonctionnalités avez-vous absolument besoin dans ce type de bibliothèques
    Moi ce que j'aimerais bien, ce serait de pouvoir tester la validité du json produit avant l'exportation (écriture sur disque ou en DB). Peut-être que c'est parce que je m'y prends mal, mais étant donné que je manipule des données pleines de garbage, mes json générés sont parfois invalides.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

Discussions similaires

  1. SplatGL : une nouvelle bibliothèque de rendu Python pour les jeux 2D
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 01/11/2014, 16h38
  2. Mantle : une nouvelle bibliothèque graphiques pour mieux contrôler le GPU
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 15/11/2013, 11h51
  3. Réponses: 1
    Dernier message: 11/09/2007, 18h25
  4. Comment créer une nouvelle fenetre pour recherche
    Par RaimS dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/06/2006, 16h02
  5. Creer une nouvelle référence pour le driver ODBC
    Par tripper.dim dans le forum Connexion aux bases de données
    Réponses: 3
    Dernier message: 04/01/2005, 22h57

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