1

私は、地理検索の proxy_fetch を利用する単純なアプリ エンジン アプリケーションに取り組んでいます。

データに対して検索と追加のフィルタリングを実行すると、すべてうまくいきます(返された結果の数を確認しましたが、予想どおりでした)しかし、単純なjsonを使用してjsonにダンプしようとすると、次のエラー:

TypeError: < backend.models.Listing object at 0x0570CC90 > is not JSON serializable

これは、コードでオブジェクトを定義する方法です。

class Listing(GeoModel):
    currency=db.IntegerProperty( default = CURRENCY["EURO"] )
    title=db.StringProperty(required = True )
    admins = db.ReferenceProperty( User )
    .
    . Some uninteresting properties goes here, Only Integer and String Properties
    .
    active = db.BooleanProperty()

    @staticmethod
    def get_listing_from_point( lat , lon ,
                            max_dist=MAX_SEARCH_RADIUS,
                            max_result=MAX_SEARCH_RESULT,
                            start_date=None,end_date=None):

        rich_query = Listing.all()
        result = Listing.proximity_fetch( rich_query , 
                                          geo.geotypes.Point( lat , lon ),
                                          max_results = max_result,
                                          max_distance = max_dist )

        result =  list( rich_query )

        valid_list = 
           [i for i in list( result ) if i.check_availability( start_date , 
                                                               end_date )]

        return  valid_list 

そして、これは近接検索を呼び出すメソッドです。

lon = self.request.args.get("lon" , None)
lat = self.request.args.get("lat" , None)
check_in = self.request.args.get("check_in" , None)
check_out = self.request.args.get("check_out" , None)
if not lon or not lat:
   return Response( json.dumps( "{ 'error' : 'desription..." ) )

result = Listing.get_listing_from_point(
                                lat = float(lat),
                                lon = float(lon),
                                start_date = check_in,
                                end_date = check_out)

return json.dumps( result )

問題の理由を見つけようとしているときに、検索の最初の結果の辞書を返そうとしました、そうすると、次のエラーが発生しました。

TypeError: datastore_types.GeoPt(23.0, 42.2) is not JSON serializable これにより、ジオポイントの処理方法に問題があると思われます...

結果なしで両方のエラーを検索しようとしましたが、手がかりはありますか?

PS、これは完全なスタックトレースです:

ファイル「C:\Program >Files\Google\google_appengine\google\appengine\ext\appstats\recording.py」、行 897、>appstats_wsgi_wrapper result = app(environ, appstats_start_response)

ファイル「C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\app.py」、245 行目、>dispatch rv = self.handle_exception(request, e)

ファイル「C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\app.py」、241 行目、>dispatch rv = self.router.dispatch(request)

ファイル「C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\routing.py」、105 行目、>dispatch rv = rv()

ファイル "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\handler.py"、297 行目、> call response = self.dispatch()

ファイル「C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\handler.py」、88 行目、>dispatch return self.handle_exception(exception=e)

ファイル「C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\handler.py」、86 行目、>dispatch return self.make_response(method(**request.rule_args))

ファイル "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\backend\handlers.py"、47 行目、> in get return json.dumps( result )

ファイル "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson__init__.py"、182 行目、ダンプ **kw.encode(obj)

ファイル "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py"、312 行目、エンコード チャンク = list(self.iterencode(o))

ファイル "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py"、行 >262、self._iterencode_list(o、マーカー) のチャンクの _iterencode 内:

ファイル "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py"、170 行目、self._iterencode のチャンクの _iterencode_list (値、マーカー):

ファイル "C:\Program Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py"、273 行目、self._iterencode_default(o、マーカー) のチャンクの _iterencode:

ファイル "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py"、279 行目、_iterencode_default newobj = self.default(o)

File "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", line >300, デフォルトでは TypeError("%r is not JSON serializable" % (o,) )

4

1 に答える 1

4

JSON にシリアル化するには、複雑な Python オブジェクトを単純な型の辞書として表現できる必要があります。「オブジェクトは JSON シリアライズ可能ではありません」というエラーは、基本的に、Python の JSON エンコーダーがオブジェクトをシリアライズする方法を認識していなかったことを意味します。

結果が GeoPt の場合、次のようにシリアル化できます。

return json.dumps({'lat': result.lat, 'lon': result.lon})

于 2011-11-02T16:11:05.283 に答える