3

什么是防止pythonjson库在遇到不知道如何序列化的对象时抛出异常的好方法?

我们json用于序列化dict对象,有时json库无法识别对象的属性,导致它抛出异常。如果它只是跳过 dict 的该属性而不是抛出异常,那就太好了。它可以将属性值设置为“无”甚至是一条消息:“无法序列化”。

现在,我知道如何做到这一点的唯一方法是明确识别并跳过json可能遇到的每种数据类型,这将使​​其引发异常。如您所见,我将datetime对象转换为字符串,但也跳过了shapely库中的一些地理点对象:

import json
import datetime
from shapely.geometry.polygon import Polygon
from shapely.geometry.point import Point
from shapely.geometry.linestring import LineString

# This sublcass of json.JSONEncoder takes objects from the
# business layer of the application and encodes them properly
# in JSON.
class Custom_JSONEncoder(json.JSONEncoder):

    # Override the default method of the JSONEncoder class to:
    # - format datetimes using strftime('%Y-%m-%d %I:%M%p')
    # - de-Pickle any Pickled objects
    # - or just forward this call to the superclass if it is not
    #   a special case object
    def default(self, object, **kwargs):
        if isinstance(object, datetime.datetime):
            # Use the appropriate format for datetime
            return object.strftime('%Y-%m-%d %I:%M%p')
        elif isinstance(object, Polygon):
            return {}
        elif isinstance(object, Point):
            return {}
        elif isinstance(object, Point):
            return {}
        elif isinstance(object, LineString):
            return {}

        return super(Custom_JSONEncoder, self).default(object)
4

3 回答 3

2

这应该做你想要的。您可以在 catch-all 返回之前添加特殊情况,或自定义回退值。

import json
import datetime


class Custom_JSONEncoder(json.JSONEncoder):
    def default(self, obj, **kwargs):
        if isinstance(obj, datetime.datetime):
            # Use the appropriate format for datetime
            return obj.strftime('%Y-%m-%d %I:%M%p')
        return None
于 2012-11-06T18:32:25.967 回答
1

如果您不想引发 TypeError,则可以省略对 json.JSONEncoder.default() 的调用。 仅对不知道如何序列化default()的对象调用。json

于 2012-11-06T19:33:24.047 回答
1

我认为这会很好:

class Rectangle(object):
    def to_json(self):
        return {}

class Custom_JSONEncoder(json.JSONEncoder):
    def default(self,  obj, **kwargs):
        if hasattr(obj, 'to_json'):
            return obj.to_json()
        ...

您将需要向其他类添加方法,但对我来说这很好。

于 2012-11-07T13:15:48.137 回答