我有一个GeoDjango模型对象,我不想序列化为json。我在我看来这样做:
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。这可以通过eval()
区域字符串在客户端中轻松修复,但我想这样做。我可以告诉simplejson
特定字符串是否已经是json并且应该按原样使用(并且不作为简单字符串返回)?或者还有另一种解决方法吗?
更新 只是为了澄清,这是当前返回的json:
{
"id": 95,
"name": "Roskilde",
"area": "{ \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 12.078701, 55.649927 ], ... ] ] ] }"
}
挑战在于将“area”设为json字典而不是简单的字符串。
答案 0 :(得分: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,请使用它(我的方式 - 寻找以'{'开头并以'}结尾的字符串是丑陋的)。
答案 1 :(得分: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')