2009-10-10 4 views
6

Sto usando un esempio JSON fuori dal web, come visto sotto.Aiuto con il formato JSON

{ 
    "menu": "File", 
    "commands": [ 
     { 
      "title": "New", 
      "action":"CreateDoc" 
     }, 
     { 
      "title": "Open", 
      "action": "OpenDoc" 
     }, 
     { 
      "title": "Close", 
      "action": "CloseDoc" 
     } 
    ] 
} 

Ho provato a caricare questo in due parser diversi, uno in C++ e in Python.

Ecco il traceback di Python.

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/json/__init__.py", line 267, in load 
    parse_constant=parse_constant, **kw) 
    File "/usr/lib/python2.6/json/__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.6/json/decoder.py", line 319, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.6/json/decoder.py", line 338, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

Ed ecco cosa riporta jsoncpp.

* Line 1, Column 1 
    Syntax error: value, object or array expected. 

Qualsiasi indizio di cosa sto facendo male?

Edit:

Ok, ecco qualche codice. Per qualche ragione ora il lavoro di Python. Non ho fatto altro che andare al negozio. Deve essere una funzione di Python - vai al negozio, gli errori casuali vanno via. Questi sviluppatori di Python sono dei geni.

Ma al punto. Ecco il codice C++.

bool CFG::CFG_Init(const char* path) { 
    bool r = reader.parse(path, root); 
    if(r) { 
     return true; 
    } else { 
     std::cout << reader.getFormatedErrorMessages() << std::endl; 
     return false; 
    } 
} 

Ho provato questo dove "percorso" era anche una stringa: std :: stessa cosa. Sto chiamando il metodo in questo modo:

if(!CFG_Init("test.json")) { 
    error("Couldn't load configuration."); 
} 

Ed ecco la classe.

class CFG: virtual Evaluator { 
    Json::Reader reader; 
    public: 
    Json::Value root; 
    bool CFG_Init(const char* path); 
    Json::Value CFG_Fetch_Raw(Json::Value section, std::string key, Json::Value defval); 
    Json::Value CFG_Fetch(Json::Value section, std::string key, Json::Value defval); 
}; 
+3

Che ne dici di mostrare il codice che stai usando per decodificarlo invece di farci indovinare? –

+0

@Paul Immagino che stia solo importando le cose con un semplice importatore JSON –

+0

@Stefano Sì, ma siccome quel JSON è perfettamente buono, il probabile colpevole è che il suo codice (nel modo in cui sta caricando il file o chiamando il codice JSON) ha una sorta di errore. Quindi, mostrare il codice che sta usando per caricarlo ci aiuterà nella diagnosi del problema. –

risposta

1

Apparentemente il parser. Posso importare correttamente il file con parser simplejson in django

>>> from django.utils import simplejson as sj 
>>> f=file("x.json") 
>>> sj.load(f) 
{u'menu': u'File', u'commands': [{u'action': u'CreateDoc', u'title': u'New'}, {u'action': u'OpenDoc', u'title': u'Open'}, {u'action': u'CloseDoc', u'title': u'Close'}]} 
>>> 
+1

Non secondo le specifiche JSON. Le chiavi sono stringhe e le stringhe sono circondate da virgolette. –

+1

Questo collegamento è solo per le fonti javascript. Json corretto richiede che le chiavi siano stringhe - quotate. Dai un'occhiata a http://json.org/ – BaroqueBobcat

+0

Quindi mi sbaglio;) –

1

Quel JSON sembra perfettamente a posto. Vorrei controllare il codice che stai usando per caricarlo, per assicurarti che tu stia caricando quel file correttamente, e usando la giusta codifica per leggere il file dal disco. Assicurati di non avere problemi come provare a leggere un file UTF-16 come UTF-8, o provare a leggere le linee terminate CRLF in qualcosa che si aspetta un avanzamento di riga, o leggere un file che inizia con un BOM con codice che non sapere come saltarlo, o qualcosa del genere. Dai un'occhiata al file in un editor esadecimale per verificare la presenza di eventuali personaggi invisibili che potrebbero lanciare oggetti.

11

Ok, dopo aver osservato il codice di jsoncpp, mi rendo conto del mio errore. Vuole il documento come una stringa, non un nome di file.

+0

+1 Per essere la risposta giusta. – Corvusoft

+0

Ho lo stesso identico problema con 'jsoncpp', ma non è il nome del file e della stringa. Lottando su ... – akauppi