2010-01-08 23 views
5

Tengo un objeto de modelo GeoDjango que no quiero serializar para json. Lo hago en mi opinión:Usando Python simplejson para devolver json pregenerado

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

El problema es que simplejson considera la a.area.geojson como una cadena sencilla, aunque es hermosa JSON generado previamente. Esto se puede arreglar fácilmente en el cliente por eval() 's de la cadena de área, pero me gustaría hacerlo de forma adecuada. ¿Puedo decir simplejson que una cadena en particular ya es json y debería usarse tal como está (y no se devuelve como una cadena simple)? ¿O hay otra solución?

ACTUALIZACIÓN Solo para aclarar, este es el momento de volver JSON:

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

El reto es tener "zona" sea un diccionario JSON en lugar de una cadena simple.

+0

"una cadena en particular ya está escrita y debería utilizarse tal como está?" Si ese es el caso, entonces ¿por qué lo haces simplejson enviándolo como tal, no entiendo lo que quieres decir con "json"? ¿Te refieres a un dict? – Prashanth

+0

Quiere decir que a.area.geojson ya es una información json que dice '{"lat": 221.22, "lng": 192.222}'. ¿Cómo puede evitar hacer simplejson.dumps nuevamente? – aatifh

+0

He tratado de aclarar el texto, me doy cuenta de que no estaba muy claro. – friism

Respuesta

2

editado después de edición del autor:

¿Se puede hacer algo como esto:

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

Creo que la forma limpia de hacer esto es mediante la extensión de JSONEncoder, y la creación de un codificador que detecta si el objeto dado ya es JSON. si lo es, simplemente lo devuelve. Si no es así, usa el código JSONEncode ordinario para codificarlo.

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) 

y, en su opinión, que utilice:

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

Si usted tiene una forma más limpia para probar que algo es ya JSON, favor lo utilizan (a mi manera - en busca de cadenas que comienzan en '{' y end in '}' es feo).

+0

Parece una buena solución, pero lo que está implícito en el primer '...' (lo siento, mi Python es bastante pobre) – friism

+0

Usted tiene razón, no está claro. Voy a editar –

Cuestiones relacionadas