JSON格式帮助
我在网上找了一个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 );
};
3 个回答
1
这个JSON看起来没问题。我建议你检查一下加载它的代码,确保你正确地加载了这个文件,并且使用了正确的编码方式来从磁盘读取文件。要注意不要出现一些问题,比如把UTF-16格式的文件当成UTF-8来读取,或者在期待换行符的情况下读取以CRLF结束的行,或者读取一个以BOM开头的文件时,代码不知道怎么跳过这个BOM,类似这样的问题。你可以用十六进制编辑器查看一下文件,看看有没有什么看不见的字符可能会导致问题。
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'}]}
>>>
11
好的,经过查看jsoncpp的代码,我明白我错在哪里了。它需要的是文档的内容作为字符串,而不是文件名。