【问题标题】:Python : JSON can't be serializedPython:无法序列化 JSON
【发布时间】:2014-01-05 17:14:56
【问题描述】:

我有以下 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")

我做错了什么?

【问题讨论】:

  • 这里的ObjectId 是什么?
  • 这是 mongo id。删除后我得到了它的工作。谢谢!

标签: python json serialization


【解决方案1】:

您的字典中包含一个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)

【讨论】:

    【解决方案2】:

    鉴于您已经解决了 cmets 中的问题,我将在此处发布解决方案,供那些发现此问题并立即寻找答案的人使用。

    问题在于 Python 中的某些对象不能轻易序列化为 JSON,ObjectId 就是其中之一。 Python 尝试将该对象转换为其等效的 JSON,但不知道如何,因此会引发错误。解决方法是确保您传递到 json.dumps 的所有值都可以正确编码(在这种情况下,将 _id 的强制转换删除为 ObjectId 并将其作为字符串传递)。

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多