2010-01-08 6 views
5

У меня есть объект модели GeoDjango, который я не хочу сериализовать для json. Я делаю это, на мой взгляд:Использование Python simplejson для возврата pregenerated 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 и должна использоваться как-is (а не возвращена как простая строка)? Или есть другое обходное решение?

UPDATE Просто чтобы прояснить, это в настоящее время возвращается в формате JSON:

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

Задача состоит в том, чтобы иметь «область» быть JSON словарь вместо простой строки.

+0

«конкретная строка уже используется json и должна использоваться как-есть?» Если это так, то почему вы делаете simplejson, отправляйте ее как таковой, я понимаю, что вы имеете в виду уже json? Ты имеешь в виду диктофон? – Prashanth

+0

Он означает, что a.area.geojson alread json data say '{"lat": 221.22, "lng": 192.222}'. Как он может избежать лишних попыток? – aatifh

+0

Я попытался прояснить текст, я понимаю, что это было не очень ясно. – friism

ответ

2

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') 
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, пожалуйста использовать его (мой путь - поиск строк, которые начинаются в '{' и end in '}' является уродливым).

+0

Похоже на хорошее решение, но что подразумевается в первом '...'? (Извините, мой Python довольно беден) – friism

+0

You «Правильно, его непонятно. Я отредактирую. –