Python:JSON无法序列化

时间:2013-12-17 19:13:08

标签: python json serialization

我有以下json:

{
    u'objectid': u'427912',
    u'fooditems': u'Cold Truck: Hamburger: cheeseburgers: hot dogs: hot sandwiches: cold sandwiches: egg muffins: cup of noodles: corn dogs: canned soup: coffee: hot cocoa: hot tea: gatorade: juice: milk: soda: water: fruits: fruit salad: rice pudding: yogurt: candy bars: chips: cookies: donuts: granola bars: muffins',
    u'facilitytype': u'Truck',
    u'priorpermit': u'1',
    u'location': {
        u'latitude': u'37.730906164188',
        u'needs_recoding': False,
        u'longitude': u'-122.373302577475'
    },
    u'lot': u'008',
    u'cnn': u'7253000',
    u'status': u'APPROVED',
    u'schedule': u'http://bsm.sfdpw.org/PermitsTracker/reports/report.aspx?title=schedule&report=rptSchedule&params=permit=13MFF-0072&ExportPDF=1&Filename=13MFF-0072_schedule.pdf',
    u'locationdescription': u'INNES AVE: EARL ST to ARELIOUS WALKER DR (700 - 799)',
    u'latitude': u'37.7309061503597',
    u'blocklot': u'4644008',
    u'address': u'Assessors Block 4644/Lot008',
    u'approved': u'2013-04-04T08:44:08',
    u'received': u'Mar 15 2013 10:24AM',
    u'applicant': u"Park's Catering",
    u'longitude': u'-122.373302577485',
    u'expirationdate': u'2014-03-15T00:00:00',
    u'permit': u'13MFF-0072',
    u'y': u'2094023.408',
    u'x': u'6019956.89',
    u'_id': ObjectId('52afeb27e8de3f3174110041'),
    u'block': u'4644'
}

当我打电话给json.dumps()时,我收到错误raise TypeError(repr(o) + " is not JSON serializable")

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您在词典中包含ObjectId()个对象。

如果没有特殊处理,该对象不可序列化。要么用原始值替换它,要么为default参数提供一个函数来为你编码这样的对象:

def objectid_default(obj):
    if isinstance(obj, ObjectId):
        return str(obj)  # hex string version
    raise TypeError(obj)

json.dumps(d, default=objectid_default)

答案 1 :(得分:0)

看到你在评论中解决了问题,我将在这里为那些发现这个问题并立即寻找答案的人发布一个解决方案。

问题是Python中的某些对象无法轻松序列化为JSON,ObjectId就是其中之一。 Python试图将该对象转换为它的JSON等价物,但不知道如何,因此它会引发错误。修复是为了确保您传递给json.dumps的所有值都可以正确编码(在这种情况下,将_id的强制转换为ObjectId并将其作为字符串传递)。