【问题标题】:Help with JSON format [closed]JSON格式的帮助[关闭]
【发布时间】:2010-12-05 16:16:37
【问题描述】:

我在网上使用了一个 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 );
};

【问题讨论】:

  • 显示你用来解码的代码而不是让我们猜测怎么样?
  • @Paul 我猜他只是在用普通的 JSON 导入器导入东西
  • @Stefano 是的,但是由于 JSON 非常好,可能的罪魁祸首是他的代码(在他如何加载文件或调用 JSON 代码方面)有某种错误。因此,显示他用来加载它的代码将有助于我们诊断问题。
  • 到目前为止,我完全同意你们两个。向我们展示代码。问题就在那里。
  • 哪里爆炸了?我只是将它复制并粘贴到一个小的 javascript 解释器中,它可以很好地读取您的代码。

标签: c++ python json


【解决方案1】:

好的,看了jsoncpp的代码,我意识到我的错误了。它希望将文档作为字符串,而不是文件名。

【讨论】:

  • +1 因为是正确的答案。
  • 我遇到了与 'jsoncpp' 完全相同的问题,但这不是文件名与字符串的关系。挣扎……
【解决方案2】:

那个 JSON 看起来非常好。我会检查您用来加载它的代码,以确保您正确加载该文件,并使用正确的编码从磁盘读取文件。确保您没有任何问题,例如尝试将 UTF-16 文件读取为 UTF-8,或尝试读取预期换行符中的 CRLF 终止行,或读取以 BOM 开头且代码不存在的文件知道如何跳过它,或任何类似的东西。在十六进制编辑器中查看该文件,以检查是否存在任何可能导致问题的不可见字符。

【讨论】:

    【解决方案3】:

    显然是你的解析器。我可以在 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'}]}
    >>> 
    

    【讨论】:

    • 不符合 JSON 规范。键是字符串,字符串用双引号括起来。
    • 该快捷方式仅适用于 javascript 源正确的 json 要求键是字符串 - 引用。看看json.org
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多