【问题标题】:JSON.loads() ValueError Extra Data in PythonJSON.loads() ValueError Python 中的额外数据
【发布时间】:2014-12-24 14:07:29
【问题描述】:

我正在尝试从 JSON 提要中读取单个值。以下是提要数据的示例:

{
    "sendtoken": "token1",
    "bytes_transferred": 0,
    "num_retries": 0,
    "timestamp": 1414395374,
    "queue_time": 975,
    "message": "internalerror",
    "id": "mailerX",
    "m0": {
        "binding_group": "domain.com",
        "recipient_domain": "hotmail.com",
        "recipient_local": "destination",
        "sender_domain": "domain.com",
        "binding": "mail.domain.com",
        "message_id": "C1/34-54876-D36FA645",
        "api_credential": "creds",
        "sender_local": "localstring"
    },
    "rejecting_ip": "145.5.5.5",
    "type": "alpha",
    "message_stage": 3
}
{
    "sendtoken": "token2",
    "bytes_transferred": 0,
    "num_retries": 0,
    "timestamp": 1414397568,
    "queue_time": 538,
    "message": "internal error,
    "id": "mailerX",
    "m0": {
        "binding_group": "domain.com",
        "recipient_domain": "hotmail.com",
        "recipient_local": "destination",
        "sender_domain": "domain.com",
        "binding": "mail.domain.com",
        "message_id": "C1/34-54876-D36FA645",
        "api_credential": "creds",
        "sender_local": "localstring"
    },
    "rejecting_ip": "145.5.5.5",
    "type": "alpha",
    "message_stage": 3
}

我无法分享实际的 URL,但以上是我运行时显示的大约 150 个结果中的前 2 个

print results

之前

json.loads()

行。

我的代码:

import urllib2
import json

results = urllib2.urlopen(url).read()
jsondata = json.loads(results)

for row in jsondata:
     print row['sendtoken']
     print row['recipient_domain']

我想要像这样的输出

token1
hotmail.com

每个条目。

我收到此错误:

ValueError: Extra data: line 2 column 1 - line 133 column 1 (char 583 - 77680)

我远非 Python 专家,这是我第一次使用 JSON。我花了很多时间在 google 和 Stack Overflow 上寻找,但我找不到适用于我的特定数据格式的解决方案。

【问题讨论】:

  • 你的json无效

标签: python json url urllib2


【解决方案1】:

这是因为 json.loads(和 json.load)不解码多个 json 对象。 例如,您想要的 json 文件可能是: [“a”:1,“b”:2] 但是代码的结构文件是: [“a”:1,“b”:2][“a”:1,“b”:2]

【讨论】:

  • ["a": 1, "b": 2] 不是 JSON 对象。您的意思是 {"a": 1, "b": 2} 吗?谢谢
【解决方案2】:

问题是您的数据没有形成 JSON 对象,因此您无法使用 json.loads 对其进行解码。


首先,这个看起来是一个由空格分隔的 JSON 对象序列。由于您不会告诉我们有关数据来自何处的任何信息,因此这实际上只是一个有根据的猜测;希望任何文档或同事或任何告诉您有关此 URL 的内容都可以告诉您格式实际上是什么。但是让我们假设我有根据的猜测是正确的。

在 Python 中解析 JSON 对象流的最简单方法是使用 raw_decode 方法。像这样:*

import json

def parse_json_stream(stream):
    decoder = json.JSONDecoder()
    while stream:
        obj, idx = decoder.raw_decode(stream)
        yield obj
        stream = stream[idx:].lstrip()

但是,流中的第二个 JSON 对象也有错误。看这部分:

…
"message": "internal error,
"id": "mailerX",
…

"internal error 后面缺少一个 "。如果你解决了这个问题,那么上面的函数将迭代两个 JSON 对象。

希望该错误是由于您尝试通过重写来手动“复制和粘贴”数据造成的。如果它在您的原始源数据中,那么您将遇到更大的问题;您可能需要从头开始编写一个“损坏的 JSON”解析器,它可以启发式地猜测数据的意图。或者,当然,让生成源的人正确生成它。


* 通常,使用raw_decode 的第二个参数来传递起始索引会更有效,而不是每次都切掉剩余部分的副本。但是raw_decode 无法处理前导空格。与编写跳过给定索引中的空白的代码相比,仅切片和剥离要容易一些,但如果这些副本的内存和性能成本很重要,您应该编写更复杂的代码。

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多