无法使用简单JSON序列化Python Appengine GeoModel子类
我正在开发一个简单的应用程序,使用了地理搜索的功能。
我进行了搜索,并对数据进行了额外的过滤,一切都很顺利(我检查了返回结果的数量,正好和预期的一样)。但是,当我尝试用简单的 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 个回答
复杂的Python对象必须能被表示成一个简单类型的字典,才能转换成JSON格式。出现“对象无法被JSON序列化”的错误,基本上就是Python的JSON编码器不知道怎么处理你的对象。
所以,如果结果是一个GeoPt对象,你可以这样进行转换:
return json.dumps({'lat': result.lat, 'lon': result.lon})