2010-01-08 10 views
5

Tôi có đối tượng mô hình GeoDjango mà tôi không muốn tuần tự hóa thành json. Tôi làm điều này trong quan điểm của tôi:Sử dụng Python simplejson để trả về json đã được tạo trước

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

Vấn đề là simplejson coi a.area.geojson như là một chuỗi đơn giản, mặc dù nó là đẹp json trước tạo ra. Điều này có thể dễ dàng được sửa trong máy khách bằng cách eval() 'nhập chuỗi vùng, nhưng tôi muốn thực hiện nó một cách thích hợp. Tôi có thể nói simplejson rằng một chuỗi cụ thể đã là json và nên được sử dụng như là (và không được trả về như một chuỗi đơn giản)? Hoặc có cách giải quyết khác không?

CẬP NHẬT Chỉ cần làm rõ, đây là json hiện trở lại:

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

Thách thức là phải có "khu vực" là một từ điển json thay vì một chuỗi đơn giản.

+0

"một chuỗi cụ thể đã là json và nên được sử dụng như là?" Nếu đó là trường hợp thì tại sao bạn làm simplejson gửi nó như vậy, tôi dint hiểu những gì bạn có nghĩa là đã json? Bạn có nghĩa là một dict? – Prashanth

+0

Anh ta có nghĩa là a.area.geojson đã đọc được dữ liệu json nói '{"lat": 221.22, "lng": 192.222}'. Làm thế nào anh có thể tránh làm simplejson.dumps một lần nữa? – aatifh

+0

Tôi đã cố gắng để làm rõ các văn bản, tôi nhận ra nó không phải là rất rõ ràng. – friism

Trả lời

2

EDITED sau khi chỉnh sửa của tác giả:

Bạn có thể làm điều gì đó như thế này:

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

Tôi nghĩ rằng cách sạch để làm điều này là bằng cách mở rộng JSONEncoder, và tạo ra một bộ mã hóa mà phát hiện nếu đối tượng nhất định đã là JSON. nếu nó là - nó chỉ trả về nó. Nếu không, nó sử dụng JSONEncoder bình thường để mã hóa nó.

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) 

và theo quan điểm của bạn, bạn sử dụng:

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

Nếu bạn có một cách sạch hơn để kiểm tra rằng một cái gì đó đã là JSON, xin sử dụng nó (con đường của tôi - tìm kiếm chuỗi bắt đầu trong '{' và kết thúc bằng '}' là xấu).

+0

Trông giống như một giải pháp tốt, nhưng những gì được ngụ ý trong lần đầu tiên '...'? (Xin lỗi, Python của tôi là khá nghèo) – friism

+0

Bạn đúng, không rõ ràng. Tôi sẽ chỉnh sửa. –