2013-12-11 26 views
0

解码:GeoAlchemy pg_function.geojson不能鉴于此功能json.loads

features是SQLAlchemy的对象列表

template只是被代表显示的内容给用户一个模板字典

def get_feature_dictionary(features, template): 

    feature_list = [] 

    print features 

    for feature in features: 

    for field in template.fields: 
     if field.data_type == 'geometry': 
      geometry = getattr(feature, field.name) 
      geometry_string = db.session.scalar(pg_functions.geojson(getattr(feature, field.name))) 

    this_feature = { 
     "type": "Feature", 
     "geometry": json.loads(geometry_string), 
     "properties": { 
     "id": feature.id, 
     "created": feature.created, 
     "status": feature.status 
     } 
    } 

    feature_list.append(this_feature) 

    return feature_list 

我想返回一个以GeoJSON是的FeatureCollection看起来像这样:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "geometry": { 
     "type":"GeometryCollection", 
     "geometries":[ 
      {"type":"Point","coordinates":[2,0]} 
     ] 
     }, 
     "properties": { 
     "created": "Tue, 03 Aug 2010 17:11:13 GMT", 
     "id": 1, 
     "status": "public" 
     }, 
     "type": "Feature" 
    } 
    ], 
    "properties": { 
    "features_per_page": "", 
    "status": { 
     "code": 200, 
     "type": "OK" 
    }, 
    "total_features": 1021, 
    "total_pages": "" 
    } 
} 

我能得到这个打印出来:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "geometry": '{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Point\",\"coordinates\":[2,0]},{\"type\":\"Polygon\",\"coordinates\":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]}]}' 
    ], 
    "properties": { 
    "features_per_page": "", 
    "status": { 
     "code": 200, 
     "type": "OK" 
    }, 
    "total_features": 1021, 
    "total_pages": "" 
    } 
} 

但是我结束了同是一条错误:

TypeError: expected string or buffer 

TypeError 
TypeError: expected string or buffer 

Traceback (most recent call last) 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
reraise(exc_type, exc_value, tb) 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
response = self.full_dispatch_request() 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
rv = self.handle_user_exception(e) 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
reraise(exc_type, exc_value, tb) 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
rv = self.dispatch_request() 
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
return self.view_functions[rule.endpoint](**req.view_args) 
File "[--removed--]/modules/api/views.py", line 116, in index 
search = get_search_results(feature_type, conditions, FeatureType) 
File "[--removed--]/modules/api/search.py", line 499, in get_search_results 
data = get_feature_dictionary(search['results'], template) 
File "[--removed--]/modules/api/utilities.py", line 241, in get_feature_dictionary 
Display the sourcecode for this frameOpen an interactive python shell in this frame"geometry": json.loads(geometry_string), 
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
return _default_decoder.decode(s) 
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
TypeError: expected string or buffer 

我试着改变使用str()类型但只是导致:

ValueError: No JSON object could be decoded 

我既GeoAlchemy(pg_functions.geojson)和GeoAlchemy2(ST_AsG试过这种eoJSON),结果相同。我知道我很接近,但由于某种原因,我没有正确传递标量或其他东西。

任何人都知道我做错了什么?

+0

我在这里看到了这个建议,但是我仍然得到了上面的错误和回溯.... http://stackoverflow.com/a/16095343/551887 –

回答

2

我发现我提出ValueError: No JSON object could be decoded错误的原因是因为我没有检查是否存在值。

我改变了这个:

geometry_string = db.session.scalar(pg_functions.geojson(getattr(feature, field.name)))

这样:

geometry_string = db.session.scalar(pg_functions.geojson(getattr(feature, field.name))) or '{}'

和一切工作完美,json.loads()被绊倒在一个空字符串,无法解析为空字符串JSON,它至少需要一个空的JSON对象{}