无法使用简单JSON序列化Python Appengine GeoModel子类

1 投票
1 回答
1097 浏览
提问于 2025-04-17 05:30

我正在开发一个简单的应用程序,使用了地理搜索的功能。

我进行了搜索,并对数据进行了额外的过滤,一切都很顺利(我检查了返回结果的数量,正好和预期的一样)。但是,当我尝试用简单的 JSON 将结果导出时,出现了以下错误:

类型错误:< backend.models.Listing 对象在 0x0570CC90 > 不能被转换为 JSON。

这是我在代码中定义对象的方式:

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 )

在尝试找出问题原因时,我试着返回搜索结果中的第一个结果的 字典,结果又出现了以下错误:

类型错误:datastore_types.GeoPt(23.0, 42.2) 不能被转换为 JSON。这让我觉得我处理地理坐标的方式可能有问题……

我尝试搜索这两个错误,但没有找到结果,有没有什么线索?

附注:这是完整的错误追踪信息:

文件 "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 行,在 get 中 return json.dumps(result)

文件 "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson__init__.py",第 182 行,在 dumps 中 **kw).encode(obj)

文件 "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py",第 312 行,在 encode 中 chunks = list(self.iterencode(o))

文件 "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py",第 262 行,在 _iterencode 中 for chunk in self._iterencode_list(o, markers):

文件 "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py",第 170 行,在 _iterencode_list 中 for chunk in self._iterencode(value, markers):

文件 "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py",第 273 行,在 _iterencode 中 for chunk in self._iterencode_default(o, markers):

文件 "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 行,在 default 中 raise TypeError("%r 不能被转换为 JSON" % (o,))

1 个回答

4

复杂的Python对象必须能被表示成一个简单类型的字典,才能转换成JSON格式。出现“对象无法被JSON序列化”的错误,基本上就是Python的JSON编码器不知道怎么处理你的对象。

所以,如果结果是一个GeoPt对象,你可以这样进行转换:

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

撰写回答