1

我正在开发一个简单的应用程序引擎应用程序,该应用程序利用地理搜索接近度获取。

我对数据进行了搜索和一些额外的过滤,一切顺利(我检查了返回结果的数量,结果和预期的一样)但是,当我尝试使用简单的 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 结果 = 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 行,>在获取返回 json.dumps(结果)

文件“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,在 _iterencode 中用于 self._iterencode_list(o,标记)中的块:

文件“C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py”,行 >170,在 _iterencode_list 中用于 self._iterencode(值,标记)中的块:

文件“C:\

文件“C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py”,第 279 行,在 _iterencode_default newobj = self.default(o)

文件“C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py”,行 >300,默认提高 TypeError("%r is not JSON serializable" % (o,) )

4

1 回答 1

4

复杂的 Python 对象必须可以表示为简单类型的字典才能序列化为 JSON。“对象不是 JSON 可序列化”错误基本上意味着 Python 的 JSON 编码器不知道如何序列化您的对象。

所以如果结果是一个 GeoPt,你可以像这样序列化它:

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

于 2011-11-02T16:11:05.283 回答