0
json.dump({'id' : '3'})

  File "/Library/Python/2.7/site-packages/simplejson/__init__.py", line 354, in dumps
    return _default_encoder.encode(obj)
  File "/Library/Python/2.7/site-packages/simplejson/encoder.py", line 262, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Library/Python/2.7/site-packages/simplejson/encoder.py", line 340, in iterencode
    return _iterencode(o, 0)
  File "/Library/Python/2.7/site-packages/simplejson/encoder.py", line 239, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: ObjectId('520183b519744a0ca3d36003') is not JSON serializable

怎么了?

4

2 回答 2

2

尝试使用标准 json 库dumps来代替。

有了这个改变,它对我来说很好。

>>> import json
>>> json.dumps({'id' : '3'})
'{"id": "3"}'
于 2013-08-06T23:38:15.147 回答
0

您真的应该澄清您使用的是 simplejson 库,而不是默认的 json 模块。我假设你有类似的东西import simplejson as json?如果其他人要查看此代码,这是一个值得商榷的决定,因为没有人期望json参考simplejson. (使用 simplejson 没有错,只是不要将其作为 json 导入。)

顶部的示例不会引发代码中的错误,例如:

>>> import simplejson as json
>>> json.dump({ 'id' : '3' })
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: dump() takes at least 2 arguments (1 given)

您在问题中显示的错误可能是因为您尝试从不序列化的对象创建 JSON 数据结构。我们需要查看您的对象以了解真正失败的原因并提供更好的解决方案。

例如:

>>> class demoObj:
...   def __init__(self):
...     self.a = '1'
...
>>> testObj = demoObj()
>>> json.dumps(testObj)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.demoObj instance at 0xe5b7a0> is not JSON serializable

请注意,这里的错误与您遇到的错误相同(对对象的引用除外)。

要序列化我的 testObj,我基本上需要能够从中获取字典。在这些问题中可以看到一些这样做的参考:

于 2013-08-06T23:43:07.507 回答