2013-12-11 22 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對象{}