JSON格式帮助

6 投票
3 回答
6314 浏览
提问于 2025-04-15 14:59

我在网上找了一个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的代码,我明白我错在哪里了。它需要的是文档的内容作为字符串,而不是文件名。

撰写回答