【问题标题】:How To Escape Characters When Reading JSON读取 JSON 时如何转义字符
【发布时间】:2010-12-19 19:50:14
【问题描述】:

我需要写出这个 JSON 响应中的所有变量:

  "result": {
    "\/common\/topic\/weblink": [
      {
        "url": "http:\/\/www.boardgamegeek.com\/boardgame\/13", 
        "description": "BoardGameGeek"
      }
    ], 
    "id": "\/en\/settlers_of_catan"
  }

所以要获取id:

result.id

但是如何获取“\/common\/topic\/weblink”的值?

【问题讨论】:

  • 您当前使用什么库来处理 json?
  • 我正在使用 Freebase-Python:code.google.com/p/freebase-python
  • 基于 Freebase-Python 中提供的示例,这应该可以工作 -- result["\/common\/topic\/weblink"]["url"] -- 但它会抛出错误, -- TemplateSyntaxError: 无法解析剩余部分:["\/common\/topic\/weblink"]["url"]

标签: python json freebase mql


【解决方案1】:

"\/common\/topic\/weblink" 解析为字符串/common/topic/weblink。任何访问解码内容的 API 都应使用生成的未转义数据;转义只是 JSON 编码的一部分。

这很好用,使用 Python 中包含的标准 JSON 模块,我强烈建议您使用它而不是第三方模块,除非您有充分的理由与众不同:

import json

json_data = r"""
{
  "result": {
    "\/common\/topic\/weblink": [
      {
        "url": "http:\/\/www.boardgamegeek.com\/boardgame\/13",
        "description": "BoardGameGeek"
      }
    ],
    "id": "\/en\/settlers_of_catan"
  }
}"""

data = json.loads(json_data)
print data["result"]["/common/topic/weblink"]

请注意,您省略了我添加的对象上的括号。

【讨论】:

  • 谢谢格伦。我使用 Python 2.5.5 作为 Google App Engine 的限制。我相信 json 是在 2.6 中引入的。让我试试看。
  • 如果它安装在旧版本的 Python 中,它可能被称为“simplejson”。 (请注意,任何在 2010 年仍处于 2.5 版本的托管服务显然没有得到合理维护,因此不应考虑任何重要的事情。)
  • 我想我很接近了。我导入了simplejson。并尝试了加载功能。 >>> json_result = simplejson.loads(result) 但是我收到一个错误(TypeError:预期的字符串或缓冲区),因为结果对象不是字符串。
  • 其实 Google App Engine 使用 2.5.5 的原因是好的。他们在 Google App Engine 团队中拥有 Python 的“发明者”。
  • @Will:没有任何借口可以通过使用这样一个过时的 Python 版本来破坏平台,雇佣 Guido 并没有丝毫改变这一点——它使情况变得更糟(但考虑到Python 3 的惨败,他并不是软件升级路径的权威)。无论如何,如果您的 JSON 文本不是字符串,那么我不知道您在做什么——我上面显示的代码可以正常工作。
【解决方案2】:

你想要类似的东西

result["\/common\/topic\/weblink"][0].url

(我认为)

【讨论】:

  • 为了清楚起见,您的示例有错字。应该是:result["\/common\/topic\/weblink"][0].url
  • 这最终是正确的答案。我将结果对象传递给 html 模板,由于某种原因我不清楚,我在从 JSON 结果中访问键时遇到困难,但在 Python 类中访问它们时没有问题。
  • 当我将结果直接打印到 html 时,我得到" {u'/common/topic/weblink': [{u'url': u'boardgamegeek.com/boardgame/13/Settlers of Catan', u'description' : u'BoardGameGeek'}], u'id': u'/en/settlers_of_catan'}
【解决方案3】:

试试

result.__getattribute__("\/common\/topic\/weblink")[0].url

【讨论】:

  • TemplateSyntaxError:变量和属性不能以下划线开头:'result.__getattribute__'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2013-10-11
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多