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

2024-06-02 09:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个简单的应用程序引擎应用程序,它利用地理搜索邻近性提取。在

我对数据执行了搜索和一些额外的过滤,一切都很顺利(我检查了返回结果的数量,这与预期的一样),但是,当我试图使用简单的json将其转储到json中时,我得到了以下错误:

TypeError: < backend.models.Listing object at 0x0570CC90 >is not JSON serializable

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

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 

这就是我称之为邻近搜索的方法:

^{pr2}$

在试图找到问题的原因时,我试图返回搜索中第一个结果的dict,当我这样做时,我得到了以下错误:

TypeError: datastore_types.GeoPt(23.0, 42.2) is not JSON serializable Which leads me to believe there is something wrong in the way I handle my geo points...

我试着寻找这两个错误都没有结果,有什么线索吗?在

另外,这是完整的堆栈跟踪:

File "C:\Program >Files\Google\google_appengine\google\appengine\ext\appstats\recording.py", line 897, in >appstats_wsgi_wrapper result = app(environ, appstats_start_response)

File "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\app.py", line 245, in >dispatch rv = self.handle_exception(request, e)

File "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\app.py", line 241, in >dispatch rv = self.router.dispatch(request)

File "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\routing.py", line 105, in >dispatch rv = rv()

File "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\handler.py", line 297, in >call response = self.dispatch()

File "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\handler.py", line 88, in >dispatch return self.handle_exception(exception=e)

File "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\tipfy\handler.py", line 86, in >dispatch return self.make_response(method(**request.rule_args))

File "C:\Users\roi.SEMANTV\PycharmProjects\gayville_tipfy\backend\handlers.py", line 47, >in get return json.dumps( result )

File "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson__init__.py", line >182, in dumps **kw).encode(obj)

File "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", line >312, in encode chunks = list(self.iterencode(o))

File "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", line >262, in _iterencode for chunk in self._iterencode_list(o, markers):

File "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", line >170, in _iterencode_list for chunk in self._iterencode(value, markers):

File "C:\Program Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", line 273, in _iterencode for chunk in self._iterencode_default(o, markers):

File "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", line 279, in _iterencode_default newobj = self.default(o)

File "C:\Program >Files\Google\google_appengine\lib\django_0_96\django\utils\simplejson\encoder.py", line >300, in default raise TypeError("%r is not JSON serializable" % (o,))


Tags: djangoinpyselfgooglelinefilesresult
1条回答
网友
1楼 · 发布于 2024-06-02 09:22:08

为了序列化为JSON,复杂的Python对象必须可以表示为简单类型的字典。“object is not JSON serializable”错误基本上意味着Python的JSON编码器不知道如何序列化对象。在

所以,如果结果是一个GeoPt,您可以这样序列化它:

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

相关问题 更多 >