Python json.loads 显示 ValueError: Extra data

新手上路,请多包涵

我从 JSON 文件“new.json”中获取一些数据,我想过滤一些数据并将其存储到一个新的 JSON 文件中。这是我的代码:

 import json
with open('new.json') as infile:
    data = json.load(infile)
for item in data:
    iden = item.get["id"]
    a = item.get["a"]
    b = item.get["b"]
    c = item.get["c"]
    if c == 'XYZ' or  "XYZ" in data["text"]:
        filename = 'abc.json'
    try:
        outfile = open(filename,'ab')
    except:
        outfile = open(filename,'wb')
    obj_json={}
    obj_json["ID"] = iden
    obj_json["VAL_A"] = a
    obj_json["VAL_B"] = b

我收到一个错误,回溯是:

   File "rtfav.py", line 3, in <module>
    data = json.load(infile)
  File "/usr/lib64/python2.7/json/__init__.py", line 278, in load
    **kw)
  File "/usr/lib64/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 88 column 2 - line 50607 column 2 (char 3077 - 1868399)

这是 new.json 中的数据示例,文件中还有大约 1500 个这样的字典

{
    "contributors": null,
    "truncated": false,
    "text": "@HomeShop18 #DreamJob to professional rafter",
    "in_reply_to_status_id": null,
    "id": 421584490452893696,
    "favorite_count": 0,
    "source": "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Mobile Web (M2)</a>",
    "retweeted": false,
    "coordinates": null,
    "entities": {
        "symbols": [],
        "user_mentions": [
            {
                "id": 183093247,
                "indices": [
                    0,
                    11
                ],
                "id_str": "183093247",
                "screen_name": "HomeShop18",
                "name": "HomeShop18"
            }
        ],
        "hashtags": [
            {
                "indices": [
                    12,
                    21
                ],
                "text": "DreamJob"
            }
        ],
        "urls": []
    },
    "in_reply_to_screen_name": "HomeShop18",
    "id_str": "421584490452893696",
    "retweet_count": 0,
    "in_reply_to_user_id": 183093247,
    "favorited": false,
    "user": {
        "follow_request_sent": null,
        "profile_use_background_image": true,
        "default_profile_image": false,
        "id": 2254546045,
        "verified": false,
        "profile_image_url_https": "https://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg",
        "profile_sidebar_fill_color": "171106",
        "profile_text_color": "8A7302",
        "followers_count": 87,
        "profile_sidebar_border_color": "BCB302",
        "id_str": "2254546045",
        "profile_background_color": "0F0A02",
        "listed_count": 1,
        "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
        "utc_offset": null,
        "statuses_count": 9793,
        "description": "Rafter. Rafting is what I do. Me aur mera Tablet.  Technocrat of Future",
        "friends_count": 231,
        "location": "",
        "profile_link_color": "473623",
        "profile_image_url": "http://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg",
        "following": null,
        "geo_enabled": false,
        "profile_banner_url": "https://pbs.twimg.com/profile_banners/2254546045/1388065343",
        "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
        "name": "Jayy",
        "lang": "en",
        "profile_background_tile": false,
        "favourites_count": 41,
        "screen_name": "JzayyPsingh",
        "notifications": null,
        "url": null,
        "created_at": "Fri Dec 20 05:46:00 +0000 2013",
        "contributors_enabled": false,
        "time_zone": null,
        "protected": false,
        "default_profile": false,
        "is_translator": false
    },
    "geo": null,
    "in_reply_to_user_id_str": "183093247",
    "lang": "en",
    "created_at": "Fri Jan 10 10:09:09 +0000 2014",
    "filter_level": "medium",
    "in_reply_to_status_id_str": null,
    "place": null
}

原文由 Apoorv Ashutosh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

正如您在以下示例中看到的那样, json.loads (和 json.load )不会解码多个 json 对象。

 >>> json.loads('{}')
{}
>>> json.loads('{}{}') # == json.loads(json.dumps({}) + json.dumps({}))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\json__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 368, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)

如果要转储多个字典,请将它们包装在一个列表中,转储列表(而不是多次转储字典)

 >>> dict1 = {}
>>> dict2 = {}
>>> json.dumps([dict1, dict2])
'[{}, {}]'
>>> json.loads(json.dumps([dict1, dict2]))
[{}, {}]

原文由 falsetru 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以只从文件中读取 jsonifying 每一行:

 tweets = []
for line in open('tweets.json', 'r'):
    tweets.append(json.loads(line))

这避免了存储中间 python 对象。只要您为每个 append() 调用写一条完整的推文,这应该可以工作。

原文由 Adam Hughes 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题