4 votes

Erreur de formatage JSON avec l'analyseur JSON de Boost

J'essaie d'utiliser Boost pour lire un fichier JSON de mon dossier de configuration de Firefox appelé sessionstore.js, où les informations sur la session actuelle/dernière session de Firefox sont enregistrées à des fins de récupération. J'ai écrit un programme basé sur la méthode Tutoriel basé sur XML du site web de Boost, en remplaçant simplement les parties XML par les parties JSON, comme on peut le voir ci-dessous

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
#include <string>
#include <set>
#include <exception>

using boost::property_tree::ptree;
using namespace std;

const string FILENAME = "sessionstore.js";
const string WINDOW_TAG = "windows";

struct session_settings    
{
    void load (const string &FILENAME);
};

void session_settings::load (const string &FILENAME)
{       
    ptree pt;
    read_json (FILENAME, pt);
}

int main()
{
    try
    {
        session_settings Settings;
        Settings.load(FILENAME);
    }
    catch (exception &e)
    {
        cout << "Error: " << e.what() << endl;
    }
    return 0;
}

Le contenu du fichier JSON que j'essaie de lire est le suivant

{"windows":[{"tabs":[{"entries":[{"url":"about:home","title":"Mozilla Firefox Start Page","ID":5,"docshellID":11,"owner_b64":"NhAra3tiRRqhyKDUVsktxQAAAAAAAAAAwAAAAAAAAEYAAQAAAAAAAS8nfAAOr03buTZBMmukiq4HoizADOUR05MxABBLoP1AAAAAAAVhYm91dAAAAARob21l4NodcC97EdOM0ABgsPwUoweiLMAM5RHTkzEAEEug/UAAAAAADm1vei1zYWZlLWFib3V0AAAABGhvbWUAAAA=","docIdentifier":5},{"url":"http://www.google.co.uk/","title":"Google","ID":6,"docshellID":11,"docIdentifier":6,"children":[{"url":"about:blank","ID":7,"docshellID":12,"owner_b64":"NhAra3tiRRqhyKDUVsktxQAAAAAAAAAAwAAAAAAAAEYAAQAAAAAAAd6UctCANBHTk5kAEEug/UAHoizADOUR05MxABBLoP1AAAAAAv////8AAABQAQAAABhodHRwOi8vd3d3Lmdvb2dsZS5jby51ay8AAAAAAAAABAAAAAcAAAAQAAAAB/////8AAAAH/////wAAAAcAAAAQAAAAFwAAAAEAAAAXAAAAAQAAABcAAAABAAAAGAAAAAAAAAAY/////wAAABf/////AAAAF/////8AAAAX/////wEAAAAAAAAAAAABAAA=","docIdentifier":7,"scroll":"0,0"}],"formdata":{"#csi":"1","#hcache":"{\"BInSTfL-EtSt8QOl24nrCg\":[[69,{}],[14,{}],[60,{}],[81,{\"persisted\":true}],[42,{}],[43,{}],[83,{}],[95,{\"kfe\":{\"kfeHost\":\"clients1.google.co.uk\",\"kfeUrlPrefix\":\"/webpagethumbnail?r=2&f=2&s=300:585&query=&hl=en&gl=uk\",\"maxPrefetchConnections\":2,\"prefetch\":90,\"slowConnection\":false},\"logging\":{\"csiFraction\":0.05,\"gen204Fraction\":0.05},\"msgs\":{\"loading\":\"Still loading...\",\"mute\":\"Mute\",\"noPreview\":\"Preview not available\",\"sound\":\"Sound:\",\"soundOff\":\"off\",\"soundOn\":\"on\",\"unmute\":\"Unmute\"},\"pb\":{\"desiredHeight\":585,\"desiredWidth\":300,\"minHeight\":200,\"minWidth\":300},\"time\":{\"hoverClose\":300,\"hoverModeTimeout\":60,\"hoverOpen\":125,\"loading\":100,\"longHoverOpen\":725,\"prefetchOnLoad\":3000,\"timeout\":2500}}],[78,{}],[25,{\"m\":{\"bks\":true,\"blg\":true,\"dsc\":true,\"evn\":true,\"frm\":true,\"isch\":true,\"klg\":true,\"mbl\":true,\"nws\":true,\"plcs\":true,\"ppl\":true,\"prc\":true,\"pts\":true,\"rcp\":true,\"shop\":true,\"vid\":true},\"t\":null}],[64,{}],[105,{}],[22,{\"m_errors\":{\"32\":\"Sorry, no more results to show.\",\"default\":\"<font color=red>Error:</font> The server could not complete your request.  Try again in 30 seconds.\"},\"m_tip\":\"Click for more information\"}],[77,{}],[84,{}],[99,{}],[29,{\"mcr\":5}],[92,{\"avgTtfc\":2000,\"fd\":1000,\"fl\":true,\"focus\":true,\"hpt\":250,\"kn\":true,\"mds\":\"clir,clue,dfn,evn,frim,klg,prc,rl,show,sp,sts,ww,mbl_he,mbl_hs,mbl_re,mbl_rs,mbl_sv,isch\",\"msg\":{\"dym\":\"Did you mean:\",\"gs\":\"Google Search\",\"kntt\":\"Use the up and down arrow keys to select each result. Press Enter to go to the selection.\",\"sif\":\"Search instead for\",\"srf\":\"Showing results for\"},\"odef\":true,\"ophe\":true,\"pq\":true,\"rpt\":41,\"tct\":\" ?\",\"tdur\":50}],[24,{}],[38,{}]]}"},"scroll":"0,0"}],"index":2,"hidden":false,"attributes":{"image":"http://www.google.co.uk/favicon.ico"},"storage":{"http://www.google.co.uk":{"web-v":"12_c9c918f0"}}}],"selected":1,"_closedTabs":[],"width":994,"height":688,"screenX":1650,"screenY":24,"sizemode":"normal","title":"Google"}],"selectedWindow":0,"_closedWindows":[{"tabs":[{"entries":[{"url":"about:home","title":"Mozilla Firefox Start Page","ID":0,"docshellID":5,"owner_b64":"NhAra3tiRRqhyKDUVsktxQAAAAAAAAAAwAAAAAAAAEYAAQAAAAAAAS8nfAAOr03buTZBMmukiq4HoizADOUR05MxABBLoP1AAAAAAAVhYm91dAAAAARob21l4NodcC97EdOM0ABgsPwUoweiLMAM5RHTkzEAEEug/UAAAAAADm1vei1zYWZlLWFib3V0AAAABGhvbWUAAAA="},{"url":"http://www.facebook.com/","title":"Welcome to Facebook - Log In, Sign Up or Learn More","ID":1,"docshellID":5,"docIdentifier":1,"formdata":{"//xhtml:div[@id='reg_form_box']/xhtml:table/xhtml:tbody/xhtml:tr[6]/xhtml:td[2]/xhtml:div/xhtml:div/xhtml:select":0,"//xhtml:div[@id='reg_form_box']/xhtml:table/xhtml:tbody/xhtml:tr[6]/xhtml:td[2]/xhtml:div/xhtml:div/xhtml:select[2]":0,"#sex":0,"#birthday_month":0,"#birthday_day":0,"#birthday_year":0},"scroll":"0,0"}],"index":2,"hidden":false,"attributes":{"image":"http://www.facebook.com/favicon.ico"}},{"entries":[{"url":"http://twitter.com/","title":"Twitter","ID":3,"docshellID":6,"docIdentifier":3,"children":[{"url":"http://api.twitter.com/receiver.html","ID":4,"docshellID":7,"referrer":"http://twitter.com/","docIdentifier":4,"scroll":"0,0"}],"formdata":{},"scroll":"0,0"}],"index":1,"hidden":false,"attributes":{"image":"http://twitter.com/phoenix/favicon.ico"}}],"selected":2,"_closedTabs":[],"width":994,"height":688,"screenX":1366,"screenY":307,"sizemode":"normal","cookies":[{"host":".facebook.com","value":"J4-69","path":"/","name":"lsd"},{"host":".facebook.com","value":"http%3A%2F%2Fwww.facebook.com%2F","path":"/","name":"reg_fb_gate"},{"host":".facebook.com","value":"http%3A%2F%2Fwww.facebook.com%2F","path":"/","name":"reg_fb_ref"},{"host":".facebook.com","value":"994x624","path":"/","name":"wd"},{"host":".twitter.com","value":"43838368","path":"/","name":"__utmc"},{"host":"twitter.com","value":"4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl","path":"/","name":"original_referer"},{"host":"scribe.twitter.com","value":"4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl","path":"/","name":"original_referer"},{"host":".twitter.com","value":"BAh7CToPY3JlYXRlZF9hdGwrCDoVZ%252F4vAToMY3NyZl9pZCIlODE2MGI1ZjJh%250AYmViNDMwODMxNDlkN2U5ZDg5Yjk4ZmU6B2lkIiU2N2I4YjdmNGExNWFkNzlk%250AODI0MDVjMGM1NmMzYjVhYSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6%250ARmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%253D%253D--8b0d751e9774c5cfaa61fdec567cb782aa8757dd","path":"/","name":"_twitter_sess","httponly":true},{"host":".twitter.com","value":"43838368","path":"/","name":"__utmc"},{"host":"twitter.com","value":"4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl","path":"/","name":"original_referer"},{"host":"scribe.twitter.com","value":"4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl","path":"/","name":"original_referer"},{"host":".twitter.com","value":"BAh7CToPY3JlYXRlZF9hdGwrCDoVZ%252F4vAToMY3NyZl9pZCIlODE2MGI1ZjJh%250AYmViNDMwODMxNDlkN2U5ZDg5Yjk4ZmU6B2lkIiU2N2I4YjdmNGExNWFkNzlk%250AODI0MDVjMGM1NmMzYjVhYSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6%250ARmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%253D%253D--8b0d751e9774c5cfaa61fdec567cb782aa8757dd","path":"/","name":"_twitter_sess","httponly":true}],"title":"Twitter"}],"session":{"state":"stopped","lastUpdate":1305658398727}}

et quand j'ai essayé de le charger avec mon programme, j'ai eu l'erreur suivante

Error: sessionstore.js(1): expected value

Comme le fichier est formaté sur une seule ligne, cela signifie que l'erreur peut se trouver n'importe où dans le fichier. Embellisseur Javascript En gardant les options par défaut, j'ai collé les résultats dans le fichier original et j'ai exécuté le programme.

Le JSON formaté est

{
    "windows": [{
        "tabs": [{
            "entries": [{
                "url": "about:home",
                "title": "Mozilla Firefox Start Page",
                "ID": 5,
                "docshellID": 11,
                "owner_b64": "NhAra3tiRRqhyKDUVsktxQAAAAAAAAAAwAAAAAAAAEYAAQAAAAAAAS8nfAAOr03buTZBMmukiq4HoizADOUR05MxABBLoP1AAAAAAAVhYm91dAAAAARob21l4NodcC97EdOM0ABgsPwUoweiLMAM5RHTkzEAEEug/UAAAAAADm1vei1zYWZlLWFib3V0AAAABGhvbWUAAAA=",
                "docIdentifier": 5
            }, {
                "url": "http://www.google.co.uk/",
                "title": "Google",
                "ID": 6,
                "docshellID": 11,
                "docIdentifier": 6,
                "children": [{
                    "url": "about:blank",
                    "ID": 7,
                    "docshellID": 12,
                    "owner_b64": "NhAra3tiRRqhyKDUVsktxQAAAAAAAAAAwAAAAAAAAEYAAQAAAAAAAd6UctCANBHTk5kAEEug/UAHoizADOUR05MxABBLoP1AAAAAAv////8AAABQAQAAABhodHRwOi8vd3d3Lmdvb2dsZS5jby51ay8AAAAAAAAABAAAAAcAAAAQAAAAB/////8AAAAH/////wAAAAcAAAAQAAAAFwAAAAEAAAAXAAAAAQAAABcAAAABAAAAGAAAAAAAAAAY/////wAAABf/////AAAAF/////8AAAAX/////wEAAAAAAAAAAAABAAA=",
                    "docIdentifier": 7,
                    "scroll": "0,0"
                }],
                "formdata": {
                    "#csi": "1",
                    "#hcache": "{\"BInSTfL-EtSt8QOl24nrCg\":[[69,{}],[14,{}],[60,{}],[81,{\"persisted\":true}],[42,{}],[43,{}],[83,{}],[95,{\"kfe\":{\"kfeHost\":\"clients1.google.co.uk\",\"kfeUrlPrefix\":\"/webpagethumbnail?r=2&f=2&s=300:585&query=&hl=en&gl=uk\",\"maxPrefetchConnections\":2,\"prefetch\":90,\"slowConnection\":false},\"logging\":{\"csiFraction\":0.05,\"gen204Fraction\":0.05},\"msgs\":{\"loading\":\"Still loading...\",\"mute\":\"Mute\",\"noPreview\":\"Preview not available\",\"sound\":\"Sound:\",\"soundOff\":\"off\",\"soundOn\":\"on\",\"unmute\":\"Unmute\"},\"pb\":{\"desiredHeight\":585,\"desiredWidth\":300,\"minHeight\":200,\"minWidth\":300},\"time\":{\"hoverClose\":300,\"hoverModeTimeout\":60,\"hoverOpen\":125,\"loading\":100,\"longHoverOpen\":725,\"prefetchOnLoad\":3000,\"timeout\":2500}}],[78,{}],[25,{\"m\":{\"bks\":true,\"blg\":true,\"dsc\":true,\"evn\":true,\"frm\":true,\"isch\":true,\"klg\":true,\"mbl\":true,\"nws\":true,\"plcs\":true,\"ppl\":true,\"prc\":true,\"pts\":true,\"rcp\":true,\"shop\":true,\"vid\":true},\"t\":null}],[64,{}],[105,{}],[22,{\"m_errors\":{\"32\":\"Sorry, no more results to show.\",\"default\":\"<font color=red>Error:</font> The server could not complete your request.  Try again in 30 seconds.\"},\"m_tip\":\"Click for more information\"}],[77,{}],[84,{}],[99,{}],[29,{\"mcr\":5}],[92,{\"avgTtfc\":2000,\"fd\":1000,\"fl\":true,\"focus\":true,\"hpt\":250,\"kn\":true,\"mds\":\"clir,clue,dfn,evn,frim,klg,prc,rl,show,sp,sts,ww,mbl_he,mbl_hs,mbl_re,mbl_rs,mbl_sv,isch\",\"msg\":{\"dym\":\"Did you mean:\",\"gs\":\"Google Search\",\"kntt\":\"Use the up and down arrow keys to select each result. Press Enter to go to the selection.\",\"sif\":\"Search instead for\",\"srf\":\"Showing results for\"},\"odef\":true,\"ophe\":true,\"pq\":true,\"rpt\":41,\"tct\":\" ?\",\"tdur\":50}],[24,{}],[38,{}]]}"
                },
                "scroll": "0,0"
            }],
            "index": 2,
            "hidden": false,
            "attributes": {
                "image": "http://www.google.co.uk/favicon.ico"
            },
            "storage": {
                "http://www.google.co.uk": {
                    "web-v": "12_c9c918f0"
                }
            }
        }],
        "selected": 1,
        "_closedTabs": [],
        "width": 994,
        "height": 688,
        "screenX": 1650,
        "screenY": 24,
        "sizemode": "normal",
        "title": "Google"
    }],
    "selectedWindow": 0,
    "_closedWindows": [{
        "tabs": [{
            "entries": [{
                "url": "about:home",
                "title": "Mozilla Firefox Start Page",
                "ID": 0,
                "docshellID": 5,
                "owner_b64": "NhAra3tiRRqhyKDUVsktxQAAAAAAAAAAwAAAAAAAAEYAAQAAAAAAAS8nfAAOr03buTZBMmukiq4HoizADOUR05MxABBLoP1AAAAAAAVhYm91dAAAAARob21l4NodcC97EdOM0ABgsPwUoweiLMAM5RHTkzEAEEug/UAAAAAADm1vei1zYWZlLWFib3V0AAAABGhvbWUAAAA="
            }, {
                "url": "http://www.facebook.com/",
                "title": "Welcome to Facebook - Log In, Sign Up or Learn More",
                "ID": 1,
                "docshellID": 5,
                "docIdentifier": 1,
                "formdata": {
                    "//xhtml:div[@id='reg_form_box']/xhtml:table/xhtml:tbody/xhtml:tr[6]/xhtml:td[2]/xhtml:div/xhtml:div/xhtml:select": 0,
                    "//xhtml:div[@id='reg_form_box']/xhtml:table/xhtml:tbody/xhtml:tr[6]/xhtml:td[2]/xhtml:div/xhtml:div/xhtml:select[2]": 0,
                    "#sex": 0,
                    "#birthday_month": 0,
                    "#birthday_day": 0,
                    "#birthday_year": 0
                },
                "scroll": "0,0"
            }],
            "index": 2,
            "hidden": false,
            "attributes": {
                "image": "http://www.facebook.com/favicon.ico"
            }
        }, {
            "entries": [{
                "url": "http://twitter.com/",
                "title": "Twitter",
                "ID": 3,
                "docshellID": 6,
                "docIdentifier": 3,
                "children": [{
                    "url": "http://api.twitter.com/receiver.html",
                    "ID": 4,
                    "docshellID": 7,
                    "referrer": "http://twitter.com/",
                    "docIdentifier": 4,
                    "scroll": "0,0"
                }],
                "formdata": {},
                "scroll": "0,0"
            }],
            "index": 1,
            "hidden": false,
            "attributes": {
                "image": "http://twitter.com/phoenix/favicon.ico"
            }
        }],
        "selected": 2,
        "_closedTabs": [],
        "width": 994,
        "height": 688,
        "screenX": 1366,
        "screenY": 307,
        "sizemode": "normal",
        "cookies": [{
            "host": ".facebook.com",
            "value": "J4-69",
            "path": "/",
            "name": "lsd"
        }, {
            "host": ".facebook.com",
            "value": "http%3A%2F%2Fwww.facebook.com%2F",
            "path": "/",
            "name": "reg_fb_gate"
        }, {
            "host": ".facebook.com",
            "value": "http%3A%2F%2Fwww.facebook.com%2F",
            "path": "/",
            "name": "reg_fb_ref"
        }, {
            "host": ".facebook.com",
            "value": "994x624",
            "path": "/",
            "name": "wd"
        }, {
            "host": ".twitter.com",
            "value": "43838368",
            "path": "/",
            "name": "__utmc"
        }, {
            "host": "twitter.com",
            "value": "4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl",
            "path": "/",
            "name": "original_referer"
        }, {
            "host": "scribe.twitter.com",
            "value": "4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl",
            "path": "/",
            "name": "original_referer"
        }, {
            "host": ".twitter.com",
            "value": "BAh7CToPY3JlYXRlZF9hdGwrCDoVZ%252F4vAToMY3NyZl9pZCIlODE2MGI1ZjJh%250AYmViNDMwODMxNDlkN2U5ZDg5Yjk4ZmU6B2lkIiU2N2I4YjdmNGExNWFkNzlk%250AODI0MDVjMGM1NmMzYjVhYSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6%250ARmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%253D%253D--8b0d751e9774c5cfaa61fdec567cb782aa8757dd",
            "path": "/",
            "name": "_twitter_sess",
            "httponly": true
        }, {
            "host": ".twitter.com",
            "value": "43838368",
            "path": "/",
            "name": "__utmc"
        }, {
            "host": "twitter.com",
            "value": "4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl",
            "path": "/",
            "name": "original_referer"
        }, {
            "host": "scribe.twitter.com",
            "value": "4bfz%2B%2BmebEkRkMWFCXm%2FCUOsvDoVeFTl",
            "path": "/",
            "name": "original_referer"
        }, {
            "host": ".twitter.com",
            "value": "BAh7CToPY3JlYXRlZF9hdGwrCDoVZ%252F4vAToMY3NyZl9pZCIlODE2MGI1ZjJh%250AYmViNDMwODMxNDlkN2U5ZDg5Yjk4ZmU6B2lkIiU2N2I4YjdmNGExNWFkNzlk%250AODI0MDVjMGM1NmMzYjVhYSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6%250ARmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%253D%253D--8b0d751e9774c5cfaa61fdec567cb782aa8757dd",
            "path": "/",
            "name": "_twitter_sess",
            "httponly": true
        }],
        "title": "Twitter"
    }],
    "session": {
        "state": "stopped",
        "lastUpdate": 1305658398727
    }
}

L'erreur

Error: sessionstore.js(179): expected value

identifie maintenant le défaut comme étant sur l'avant-dernière ligne, celle qui dit "lastUpdate": 1305658398727 . De ce que j'ai lu à propos du format JSON, il me semble qu'il manque une virgule ou une parenthèse dans cette ligne, mais il s'agit d'un fichier qui a été produit par Mozilla pour fonctionner avec Firefox, et je ne crois pas qu'ils feraient une telle erreur, donc je suis amené à croire qu'il y a un problème avec le parseur JSON dans Boost. Quelqu'un peut-il confirmer si c'est le cas, ou si c'est moi qui fais quelque chose de mal ?

6voto

Diego Sevilla Points 17274

Je pense que le problème est que cette valeur est plus grande qu'un int o un double . Je ne sais pas quel type de données utilise BOOST JSON pour la lecture des chiffres. Pour tester cela, il suffit de changer le nombre en une chaîne de caractères et de l'analyser à nouveau. Dans la norme, les nombres ne sont pas limités, mais vous devez sélectionner un type de données pour les représenter, et peut-être qu'ils ont choisi double ce qui n'est pas suffisant pour ce numéro. Je vais jeter un coup d'œil pour voir si vous pouvez configurer le type utilisé pour les numéros.

EDIT :

En regardant à nouveau l'implémentation, la règle du "nombre" est implémentée en utilisant Spirit comme suit :

number
            =   strict_real_p
                | int_p
                ;

Regarder l'esprit strict_real_p utiliza double comme type sous-jacent, et int_p utilise en fait un int .

La mauvaise nouvelle est que, pour ce que je vois dans le code, ce n'est pas configurable, il faut donc modifier le JSON à interpréter.

1voto

Après avoir reçu les réponses de Diego Sevilla et de c-smile, j'ai fait un peu de recherche sur Google pour savoir comment incorporer leurs suggestions dans Boost, puisque modifier le fichier JSON n'est malheureusement pas une option dans mon cas, et je suis tombé sur ce ticket sur le bug tracker de Boost qui décrit exactement mon problème. Il a depuis été corrigé et publié avec Boost 1.45. Cependant, j'utilise la version 1.42 des dépôts Ubuntu, et je dois donc installer la nouvelle version manuellement.

0voto

c-smile Points 8609

Comme Diego l'a dit, c'est parce que 1305658398727 n'entre dans aucune des deux catégories. strict_real_p ni int_p production.

Je pense que vous aurez besoin soit d'un autre analyseur JSON, soit de modifier vous-même les définitions de Spirit.

Soit comme ça :

number
            =   strict_real_p
                | int_p
                | int64_p
                ;

ou juste comme :

number
            =   real_p;

Idéalement, la date et l'heure dans JSON devraient être présentées par des chaînes de caractères au format ISO. Dans ce cas, vous n'aurez pas de tels problèmes. Je soupçonne que les données sont juste un nombre de millisecondes depuis 1970-01-01 (JavaScript Date.valueOf() )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X