Я работаю над простым приложением приложений приложений, которое использует гео-поиск proximity_fetch.
Я выполняю поиск и некоторую дополнительную фильтрацию данных, и все идет хорошо (я проверил количество возвращенных результатов, и это было так же, как ожидалось). Однако, когда я пытался сбрасывать его в json, используя простой json, я получил следующая ошибка:
TypeError: <backend.models.Listing object at 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 )
При попытке найти причину проблемы я попытался вернуть dict первого результата в поиске, и когда я это сделал, я получил следующую ошибку:
TypeError: datastore_types.GeoPt(23.0, 42.2) не является сериализуемым JSON. Это заставляет меня думать, что что-то не так в том, как я обрабатываю свои гео-точки...
Я пробовал искать обе ошибки без каких-либо результатов, никаких подсказок?
PS, это полный стек:
Файл "C:\Program> Файлы \Google\google_appengine\google\appengine\ext\appstats\record.py", строка 897, в> appstats_wsgi_wrapper result = app (environ, appstats_start_response)
Файл "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\app.py", строка 245, в> диспетчеризация rv = self.handle_exception (запрос, e)
Файл "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\app.py", строка 241, в> рассылка rv = self.router.dispatch (запрос)
Файл "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\routing.py", строка 105, в> диспетчеризация 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, в> отправке return self.handle_exception (exception = e)
Файл "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\handler.py", строка 86, в> отправке return self.make_response (метод (** request.rule_args))
Файл "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\backend\handlers.py", строка 47,> в get return json.dumps(result)
Файл "C:\Program> Файлы \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, в кодировке chunks = 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, markers):
Файл "C:\Program Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", строка> 170, в _iterencode_list для фрагмента в self._iterencode (значение, маркеры):
Файл "C:\Program Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", строка 273, в _iterencode для фрагмента в 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, по умолчанию вызывает TypeError ("% r не является сериализуемым JSON"% (o,) )
Сложные объекты Python должны быть представлены в виде словаря простых типов для сериализации в JSON. Ошибка "объект не является JSON-сериализуемым" означает, что кодер Python JSON не знал, как сериализовать ваш объект.
Поэтому, если результатом является GeoPt, вы можете сериализовать его следующим образом:
return json.dumps({'lat': result.lat, 'lon': result.lon})