Не удается JSON сериализовать подкласс Python Appengine GeoModel, используя простой json

1

Я работаю над простым приложением приложений приложений, которое использует гео-поиск 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,) )

Теги:
google-app-engine
simplejson

1 ответ

4
Лучший ответ

Сложные объекты Python должны быть представлены в виде словаря простых типов для сериализации в JSON. Ошибка "объект не является JSON-сериализуемым" означает, что кодер Python JSON не знал, как сериализовать ваш объект.

Поэтому, если результатом является GeoPt, вы можете сериализовать его следующим образом:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню