ValueError('无JSON对象可以解码')不是JSON可序列化的

时间:2014-01-14 09:58:20

标签: python json facebook

我的代码正在获取Facebook信息我会收到此错误

Traceback (most recent call last):
  File "crawler.py", line 34, in <module>
    print graph.get_information(url[i]).encode('utf-8')
  File "/weblog/workingspace/thun/facebook-api/facebook_api.py", line 23, in get_information
    return json.dumps(ret)
  File "/usr/lib64/python2.6/json/__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib64/python2.6/json/encoder.py", line 367, in encode
    chunks = list(self.iterencode(o))
  File "/usr/lib64/python2.6/json/encoder.py", line 306, in _iterencode
    for chunk in self._iterencode_list(o, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 204, in _iterencode_list
    for chunk in self._iterencode(value, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 309, in _iterencode
    for chunk in self._iterencode_dict(o, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 275, in _iterencode_dict
    for chunk in self._iterencode(value, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 317, in _iterencode
    for chunk in self._iterencode_default(o, markers):
  File "/usr/lib64/python2.6/json/encoder.py", line 323, in _iterencode_default
    newobj = self.default(o)
  File "/usr/lib64/python2.6/json/encoder.py", line 344, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: ValueError('No JSON object could be decoded',) is not JSON serializable

我的代码是:

print graph.get_information("name of user").encode('utf-8')

我不知道什么是错的,因为当我使用https://developers.facebook.com/tools/explorer获取信息时。这是工作 但是当我使用facebook-api时,我遇到了一些错误。 请帮我。 谢谢你的关注。

聚苯乙烯。抱歉我的英文不好

1 个答案:

答案 0 :(得分:0)

错误显示“某些类型不是JSON可序列化”,这意味着您从facebook获取的数据包含JSON不支持的数据类型。 JSON支持以下数据类型

  • 原始类型
    • 字符串
    • 布尔
  • 结构类型
    • 对象
    • 阵列

实际将数据转换为JSON的代码(在您的情况下为facebook_api.py)需要处理此问题。您可以编写一个自定义json编码器来处理JSON不支持的所有数据类型。例如。

class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        if isinstance(obj, date):
            return obj.isoformat()
        else:
            return super(CustomJSONEncoder, self).default(obj)

在上面的代码中,我正在处理JSON不支持的'decimal'和'date'数据类型。然后,您需要在调用'json.dumps'

时使用此自定义JSON编码器
json.dumps(input_dict, cls=CustomJSONEncoder)