3

jsonシリアル化の方法がわからないオブジェクトに遭遇したときにPythonのライブラリが例外をスローしないようにするための良い方法は何ですか?

dictオブジェクトをシリアル化するために使用jsonしていますが、オブジェクトのプロパティが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

これはあなたが望むことをするはずです。キャッチオール リターンの前に特別なケースを追加したり、フォールバック値をカスタマイズしたりできます。

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

私はこれが良いと思います:

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 に答える
1

TypeError を発生させたくない場合は、json.JSONEncoder.default() の呼び出しを省略できます。 シリアル化の方法がわからないdefault()オブジェクトに対してのみ呼び出されます。json

于 2012-11-06T19:33:24.047 に答える