У меня есть объект модели GeoDjango что я want't для сериализации к 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 ], ... ] ] ] }"
}
Проблема состоит в том, чтобы иметь "область" быть json словарем вместо простой строки.
EDITED после авторского редактирования:
Можете ли вы сделать что-нибудь подобное:
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')
Я думаю, что чистым способом сделать это является расширение 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, пожалуйста используйте его (мой способ - искать строки, которые начинаются на '{' и заканчиваются на '}' - это уродливо).