Использование Python simplejson для возврата предварительно сгенерированного json - PullRequest
5 голосов
/ 08 января 2010

У меня есть объект модели 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 и должна использоваться как есть (а не возвращаться как простая строка)? Или есть другой обходной путь?

UPDATE Просто чтобы уточнить, это json, который в настоящее время возвращается:

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

Задача состоит в том, чтобы "area" была словарём json вместо простой строки.

Ответы [ 2 ]

5 голосов
/ 08 января 2010

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

2 голосов
/ 08 января 2010

ИЗМЕНЕНО после редактирования автором:

Можете ли вы сделать что-то вроде этого:

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')
...