我正在网上使用JSON示例,如下所示。
{
"menu": "File",
"commands": [
{
"title": "New",
"action":"CreateDoc"
},
{
"title": "Open",
"action": "OpenDoc"
},
{
"title": "Close",
"action": "CloseDoc"
}
]
}
我尝试在两个不同的解析器中加载它,一个用C ++和Python。
这是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 );
};
答案 0 :(得分:11)
好的,看了jsoncpp的代码后,我发现了我的错误。它希望文档为字符串,而不是文件名。
答案 1 :(得分: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'}]}
>>>
答案 2 :(得分:1)
JSON看起来非常好。我会检查您用来加载它的代码,以确保正确加载该文件,并使用正确的编码从磁盘读取文件。确保您没有任何问题,例如尝试将UTF-16文件读取为UTF-8,或者尝试在期望换行的内容中读取CRLF终止行,或者读取以BOM开头的代码不是知道如何跳过它,或任何类似的东西。在十六进制编辑器中查看该文件,以检查可能会丢失任何内容的任何不可见字符。