【问题标题】:ValueError: malformed stringValueError:格式错误的字符串
【发布时间】:2016-09-06 20:09:11
【问题描述】:

我正在使用返回以下 unicode 作为响应的 API:

    dd = u"""{"meta":{"request":{"granularity":"Weekly","main_domain_only":false,
"domain":"borivali.me",
    "country":"world"},"status":"Success",
"last_updated":"2016-05-09"},"bounce_rate":[{"date":"2016-04-12","bounce_rate":0.5},
    {"date":"2016-04-19","bounce_rate":0.13355382826388454},
{"date":"2016-04-26","bounce_rate":0.0},
    {"date":"2016-05-03","bounce_rate":0.23602940883106352}]}"""

我正在尝试通过以下方式解析此信息:

ddd = ast.literal_eval(dd)
print ddd

但是,我收到以下错误:

ValueError: malformed string

我的代码似乎有什么问题?

PS:dd 存储的是 unicode 字符串而不是字典。

【问题讨论】:

  • 有什么要解析的? dd 是一个字典,使用它。
  • @DisplayName 它是一个 unicode。已经在文章开头提到了。
  • 向我们展示minimal reproducible example - unicode literal 被解析,而不是 Python 字典文字。

标签: python json python-2.7 api unicode


【解决方案1】:

假设以下定义是正确的:

s = u"""{"meta":{"request":{"granularity":"Weekly","main_domain_only":false,
"domain":"borivali.me",
    "country":"world"},"status":"Success",
"last_updated":"2016-05-09"},"bounce_rate":[{"date":"2016-04-12","bounce_rate":0.5},
    {"date":"2016-04-19","bounce_rate":0.13355382826388454},
{"date":"2016-04-26","bounce_rate":0.0},
    {"date":"2016-05-03","bounce_rate":0.23602940883106352}]}"""

鉴于该声明,s 是 JSON 文档,可以使用 json 库解析为 Python 对象。

import json
p = json.loads(s)

ast模块用于反序列化repr的Python对象,一般情况下repr不等于JSON序列化。以下关系成立(至少对于简单的 Python 类型,在 JSON 标准中定义良好 - 列表、字典和字符串)。

d == ast.literal_eval(repr(d))
d == json.loads(json.dumps(d))

【讨论】:

  • 补充一点,s 的内容不是有效的 Python(你可以通过将它们粘贴到脚本中并直接运行它来查看)因为false,它在 Python将是False。没有那个literal_eval 会起作用。但是使用json 绝对是正确的做法。
猜你喜欢
  • 1970-01-01
  • 2013-12-05
  • 2020-10-10
  • 2015-12-18
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多