2010-01-08 6 views
5

Ich habe ein GeoDjango-Modell-Objekt, das ich nicht zu json serialisieren möchte. Ich tue dies in meiner Sicht:Mit Python simplejson vorgenerierten 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') 

Das Problem ist, dass simplejson die a.area.geojson als einfacher String hält, auch wenn es schön vorab generierte json ist. Dies wird leicht im Client durch eval() 'in der Bereichs-Zeichenfolge behoben, aber ich möchte es richtig machen. Kann ich sagen simplejson, dass eine bestimmte Zeichenfolge bereits Json ist und sollte verwendet werden, wie es ist (und nicht als eine einfache Zeichenfolge zurückgegeben)? Oder gibt es eine andere Problemumgehung?

UPDATE Nur um zu klären, ist dies die json ist zur Zeit zurückgegeben:

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

Die Herausforderung ist „Bereich“ sein ein json Wörterbuch anstelle eines einfachen String zu haben.

+0

"eine bestimmte Zeichenfolge ist bereits JSON und sollte verwendet werden, wie es ist?" Wenn das der Fall ist, warum machst du SimpleJson senden es als solche, ich verstehe nicht, was Sie schon JSON bedeuten? Du meinst ein Diktat? – Prashanth

+0

Er bedeutet a.area.geojson ist bereits ein JSON Daten sagen '{"lat": 221.22, "lng": 192.222}'. Wie kann er vermeiden, simplejson.dumps wieder zu tun? – aatifh

+0

Ich habe versucht, den Text zu klären, ich weiß, dass es nicht sehr klar war. – friism

Antwort

2

nach bearbeiten Autor Edited:

Können Sie so etwas tun:

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

Ich denke, die saubere Art und Weise dies durch die Erweiterung JSONEncoder, zu tun ist, und die Schaffung eines Gebers, wenn das gegebene Objekt erfasst ist schon JSON. wenn es ist - es gibt es einfach zurück. Wenn es nicht ist, verwendet es den gewöhnlichen JSONEncoder, um es zu kodieren.

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) 

und Ihrer Ansicht verwenden Sie:

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

Wenn Sie eine sauberere Art und Weise haben, dass etwas zu testen, ist bereits JSON, bitte es verwenden (meine Art und Weise - für Strings suchen, starten in '{' und endet in '}' ist hässlich).

+0

Sieht aus wie eine gute Lösung, aber was ist in der ersten "..."? (Entschuldigung, mein Python ist ziemlich schlecht) – friism

+0

Sie Stimmt, es ist nicht klar. Ich werde bearbeiten. –