GeoAlchemy结合Postgres拼接GeoJSON出现冗余反斜杠问题
问题根因
最终响应出现大量冗余反斜杠,本质是两处操作不符合GeoJSON序列化要求:
db.session.query(func.ST_AsGeoJSON(self.geometry)).first()返回的是SQLAlchemy包裹的单行元组结果,不是可直接使用的GeoJSON值,直接嵌入字典后会被JSON序列化器识别为非常规对象,生成带转义的错误结构- 就算从结果中取出了
ST_AsGeoJSON生成的GeoJSON字符串,如果直接将字符串作为geometry字段值、没有转为结构化字典,序列化过程会把这个字符串做二次转义,就会出现满屏的反斜杠。
补充说明:你直接打印结果时看到的
"是控制台的HTML转义渲染效果,并非字符串内部的实际内容,不需要做额外替换。
标准处理流程
- 用SQLAlchemy的
scalar()方法直接取出查询结果第一列的原始GeoJSON字符串,跳过元组包裹层,避免取错值 - 调用Python内置
json模块,把取出的GeoJSON字符串解析为字典结构,匹配GeoJSON规范对geometry字段的格式要求 - 将解析后的字典填入自定义Feature结构,直接作为JSON响应返回即可
正确实现代码
import json # 直接取出ST_AsGeoJSON返回的纯字符串值,跳过元组包裹层 geometry_geojson_str = db.session.query( func.ST_AsGeoJSON(self.geometry) ).scalar() # 将字符串解析为结构化字典,避免序列化时被转义 geometry_dict = json.loads(geometry_geojson_str) # 构造符合GeoJSON规范的Feature结构 geojson_feature = { "type": "Feature", "geometry": geometry_dict, "properties": { "Nome": "Default", "Qualidade": "Default" } }
避坑提示
- 不要手动对获取到的GeoJSON字符串做HTML反转义、特殊字符替换操作,数据库返回的
ST_AsGeoJSON结果是标准可直接解析的JSON字符串,打印时看到的转义符只是输出层的渲染效果 - 不要将未解析的GeoJSON字符串直接作为
geometry字段的值,否则框架序列化时会将其识别为普通文本,生成类似"geometry": "{\"type\": \"Polygon\"}"的错误格式,前端地图组件无法识别。
内容的提问来源于stack exchange,提问作者Gabriel Reis
相关产品推荐
相关产品推荐

