2009-10-10 21 views
6

私は以下のように、WebからJSONの例を使用しています。JSON形式のヘルプ

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

これをC++とPythonの2つの異なるパーサーでロードしようとしました。

ここには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 

次に、jsoncppが報告する内容を示します。

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

私は間違っていると思いますか?

編集:

ここにいくつかのコードがあります。何らかの理由でPythonが動作しています。私は何もしなかったが、店に行く。これはPythonの機能でなければなりません。ストアに行くと、ランダムなエラーが消えます。それらのPython開発者は天才です。

しかし、ポイントです。ここに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; 
    } 
} 

私はこれを試しましたが、 'path'はstd :: stringでも同じです。私はこのようなメソッドを呼び出しています:

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

そしてここにクラスがあります。

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

私たちに推測させる代わりに、デコードするコードを表示するのはどうですか? –

+0

@Paul彼は単純なJSONインポーター –

+0

@Stefanoで物をインポートしていると思いますが、JSONは完全に良いので、彼のコード(JSONコードの読み込み方法やJSONコードの呼び出し方法など)何らかのエラーがあります。だから、彼がそれをロードするために使用しているコードを表示することで、問題の診断に役立ちます。 –

答えて

1

あなたのパーサーは明らかです。私はdjangoでsimplejsonパーサーを使ってファイルを正しくインポートできます。

>>> 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

JSON仕様に準拠していません。キーは文字列で、文字列は二重引用符で囲まれています。 –

+1

そのショートカットはjavascriptソースのみに適しています。適切なjsonはキーを文字列にする必要があります。それをチェックしてくださいhttp://json.org/ – BaroqueBobcat

+0

従って私は間違っています;) –

1

JSONは完璧に見えます。私はあなたがそれをロードするために使用しているコードをチェックし、そのファイルを正しくロードしていることを確認し、ディスクからファイルを読み込むための正しいエンコーディングを使用します。あなたがUTF-8としてUTF-16ファイルを読み込もうとしているか、改行が必要なものでCRLFで終わる行を読み込もうとしているか、BOMで始まらないファイルでBOMで始まるファイルを読むなどの問題がないことを確認してくださいそれをスキップする方法、またはその種のものを知っている。 16進エディタでファイルを見て、物事を投げ捨てている可能性のある目に見えない文字がないか調べます。

11

[OK]をjsoncppのコードを見て、私のエラーを実現します。それはファイル名ではなく文字列としてドキュメントを望んでいます。

+0

+1正しい答えであるために。 – Corvusoft

+0

「jsoncpp」とまったく同じ問題が発生していますが、ファイル名と文字列ではありません。悩んでいる... – akauppi