5

我有一个不想序列化为 json 的 GeoDjango 模型对象。在我看来,我这样做:

lat = float(request.GET.get('lat'))
lng = float(request.GET.get('lng'))
a = Authority.objects.get(area__contains=Point(lng, lat))
if a:
    return HttpResponse(simplejson.dumps({'name': a.name, 
                                          'area': a.area.geojson,
                                          'id': a.id}), 
                        mimetype='application/json')

问题在于simplejson将 a.area.geojson 视为一个简单的字符串,即使它是漂亮的预生成 json。这很容易通过 'ing 区域字符串在客户端中修复eval(),但我想正确地做到这一点。我可以告诉simplejson一个特定的字符串已经是 json 并且应该按原样使用(而不是作为简单字符串返回)吗?还是有其他解决方法?

更新 澄清一下,这是当前返回的 json:

{
    "id": 95,
    "name": "Roskilde",
    "area": "{ \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 12.078701, 55.649927 ], ... ] ] ] }"
}

挑战在于让“区域”成为一个 json 字典而不是一个简单的字符串。

4

2 回答 2

5

我认为做到这一点的干净方法是扩展 JSONEncoder,并创建一个编码器来检测给定对象是否已经是 JSON。如果是 - 它只是返回它。如果不是,它使用普通的 JSONEncoder 对其进行编码。

class SkipJSONEncoder(simplejson.JSONEncoder):
     def default(self, obj):
         if isinstance(obj, str) and (obj[0]=='{') and (obj[-1]=='}'): 
             return obj
         return simplejson.JSONEncoder.default(self, obj)

在您看来,您使用:

simplejson.dumps(..., cls=SkipJSONEncoder)

如果您有一种更简洁的方法来测试某些东西是否已经是 JSON,使用它(我的方式 - 查找以 '{' 开头并以 '}' 结尾的字符串很难看)。

于 2010-01-08T14:23:39.770 回答
2

在作者编辑后编辑:

你能做这样的事情:

lat = float(request.GET.get('lat'))
lng = float(request.GET.get('lng'))
a = Authority.objects.get(area__contains=Point(lng, lat))
if a:
    json = simplejson.dumps({'name': a.name, 
                             'area': "{replaceme}",
                             'id': a.id}), 
    return HttpResponse(json.replace('"{replaceme}"', a.area.geojson),
                        mimetype='application/json')
于 2010-01-08T13:33:56.970 回答