Не удается JSON сериализовать подкласс Python Appengine GeoModel, используя простой json - PullRequest
1 голос
/ 02 ноября 2011

Я работаю над простым приложением для движка приложений, которое использует гео-поиск бесконтактный поиск

Я выполняю поиск и некоторую дополнительную фильтрацию данных, и все идет хорошо (я проверил количество возвращаемых результатов, и это было так, как ожидалось). Однако, когда я попытался вывести его в json, используя простой json, Я получил следующую ошибку:

TypeError: <объект 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 )

Пытаясь найти причину проблемы, я пытался вернуть dict первого результата поиска, и когда я это сделал, я получил следующую ошибку:

TypeError: datastore_types.GeoPt (23.0, 42.2) не поддерживает сериализацию в формате JSON Что заставляет меня верить, что в том, как я справляюсь со своими географическими точками, что-то не так ...

Я пытался найти обе ошибки безрезультатно, какие-либо подсказки?

P.S, это полная трассировка стека:

Файл "C: \ Program> Files \ Google \ google_appengine \ google \ appengine \ ext \ appstats \ recording.py", строка 897, в> appstats_wsgi_wrapper результат = приложение (environment, 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, в> , вызов response = self.dispatch ()

Файл "C: \ Users \ roi.SEMANTV \ PycharmProjects \ gayville_tipfy \ tipfy \ handler.py", строка 88, в> отправке вернуть self.handle_exception (исключение = e)

Файл "C: \ Users \ roi.SEMANTV \ PycharmProjects \ gayville_tipfy \ tipfy \ handler.py", строка 86, в> отправке вернуть self.make_response (метод (** request.rule_args))

Файл "C: \ Users \ roi.SEMANTV \ PycharmProjects \ gayville_tipfy \ backend \ handlers.py", строка 47,> в get возврат json.dumps (результат)

Файл "C: \ Program> Files \ Google \ google_appengine \ lib \ django_0_96 \ django \ utils \ simplejson__init __. Py", строка> 182, в дампах ** кВт) .encode (объект)

Файл "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, маркеры):

Файл "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, маркеры):

Файл "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,))

1 Ответ

4 голосов
/ 02 ноября 2011

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

Так что, если результат - GeoPt, вы можете его сериализовать так:

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

...