即使输入正确,Python JSON模块也会出错

时间:2013-10-29 23:51:25

标签: python json python-3.x delimiter simplejson

对于组项目,我必须使用python导入JSON对象。坏的是python不断给我一个错误消息,即使JSON字符串是正确的(使用JSONLint检查它)。我用来测试它的脚本如下:

import json

correct_json = """ { 
    "created_at": "Tue Feb 19 18:42:07 +0000 2013", 
    "id": 303937526471725060, 
    "id_str": "303937526471725056", 
    "text": "Batavierenrace door #Ulft: Eind april klinkt jaarlijks het startschot voor de grootste estafetteloop v... http:\\/\\/t.co\\/hijGD3pk #Enschede", 
    "source": "<a href=\"http://twitterfeed.com\" rel=\"nofollow\"> twitterfeed </a>", 
    "truncated": false, 
    "in_reply_to_status_id": null, 
    "in_reply_to_status_id_str": null, 
    "in_reply_to_user_id": null, 
    "in_reply_to_user_id_str": null, 
    "in_reply_to_screen_name": null, 
    "user": { 
        "id": 258430204, 
        "id_str": "258430204", 
        "name": "EnschedeNieuws", 
        "screen_name": "nieuws_enschede", 
        "location": "", 
        "url": "http://drimble.nl/regio/overijssel/enschede/", 
        "description": "AlhetnieuwsoverEnschede", 
        "protected": false, 
        "followers_count": 1344, 
        "friends_count": 17, 
        "listed_count": 18, 
        "created_at": "Sun Feb 27 18:17:21 +0000 2011", 
        "favourites_count": 0, 
        "utc_offset": null, 
        "time_zone": null, 
        "geo_enabled": false, 
        "verified": false, 
        "statuses_count": 20044, 
        "lang": "en", 
        "contributors_enabled": false, 
        "is_translator": false, 
        "profile_background_color": "131516", 
        "profile_background_image_url": "http://a0.twimg.com/images/themes/theme14/bg.gif", 
        "profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme14/bg.gif", 
        "profile_background_tile": true, 
        "profile_image_url": "http://a0.twimg.com/profile_images/1256839194/enschede_normal.jpg", 
        "profile_image_url_https": "https://si0.twimg.com/profile_images/1256839194/enschede_normal.jpg", 
        "profile_link_color": "009999", 
        "profile_sidebar_border_color": "EEEEEE", 
        "profile_sidebar_fill_color": "EFEFEF", 
        "profile_text_color": "333333", 
        "profile_use_background_image": true, 
        "default_profile": false, 
        "default_profile_image": false, 
        "following": null, 
        "follow_request_sent": null, 
        "notifications": null 
    }, 
    "geo": null, 
    "coordinates": null, 
    "place": null, 
    "contributors": null, 
    "retweet_count": 0, 
    "entities": { 
        "hashtags": [ 
            { 
                "text": "Ulft", 
                "indices": [ 
                    20, 
                    25 
                ] 
            }, 
            { 
                "text": "Enschede", 
                "indices": [ 
                    127, 
                    136 
                ] 
            } 
        ], 
        "urls": [ 
            { 
                "url": "http://t.co/hijGD3pk", 
                "expanded_url": "http://bit.ly/UE0MCq", 
                "display_url": "bit.ly/UE0MCq", 
                "indices": [ 
                    106, 
                    126 
                ] 
            } 
        ], 
        "user_mentions": [] 
    }, 
    "favorited": false, 
    "retweeted": false, 
    "possibly_sensitive": false 
} """

other_json = """ { \
    "foo" : 5,\
    "bar" : ["spam", "eggs"] \
} """

print(json.dumps(json.loads(correct_json), sort_keys=True, indent=4 * ' '))

很抱歉只是寻求这么大的JSON结构的帮助,但是这段代码现在已经磨了我超过一个小时,我只是无法发现错误。我希望训练有素的JSON侦探可以帮助我。错误python给我的是:

D:\Documenten\Dropbox>python jsontest.py
Traceback (most recent call last):
  File "jsontest.py", line 99, in <module>
    print(json.dumps(json.loads(correct_json), sort_keys=True, indent=4 * ' '))
  File "C:\Python33\lib\json\__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "C:\Python33\lib\json\decoder.py", line 352, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python33\lib\json\decoder.py", line 368, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting ',' delimiter: line 6 column 25 (char 305)

我正在使用Python 3.我可能错过了一些愚蠢的事情(这不是第一次)。提前谢谢!

1 个答案:

答案 0 :(得分:2)

这是一个双重逃避问题:

"source": "<a href=\"http://twitterfeed.com\" rel=\"nofollow\"> twitterfeed </a>", 

当您\"需要将其保留转义时,"会被解释为\\"。所以你需要转义转义字符,就像\"一样,然后变成"source": "<a href=\\"http://twitterfeed.com\\" rel=\\"nofollow\\"> twitterfeed </a>",

所以修复是:

correct_json = r""" {

或者,将整个字符串声明为原始字符串,如下所示:

{{1}}

但是这会弄乱一些已经逃过的序列。