2010-01-08 12 views
5

लौटने के लिए पायथन सरलजसन का उपयोग करना मेरे पास एक जियोडजैंगो मॉडल मॉडल है जिसे मैं जेसन को क्रमबद्ध नहीं करना चाहता हूं। मैं मेरे विचार में ऐसा करते हैं:प्रीजेनरेटेड जेसन

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 वर्तमान में लौट आए है:

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

चुनौती है "क्षेत्र" एक json शब्दकोश के बजाय एक साधारण स्ट्रिंग हो।

+0

"एक विशेष स्ट्रिंग पहले से ही जेसन है और इसका उपयोग किया जाना चाहिए?" यदि ऐसा है तो आप इसे सरल भेजकर क्यों कर रहे हैं, मैं समझता हूं कि आप पहले से ही जेसन द्वारा क्या मतलब रखते हैं? तुम्हारा मतलब एक नियम है? – Prashanth

+0

उसका मतलब है कि a.area.geojson एक जेसन डेटा को '{"lat": 221.22, "lng": 192.222}' से डरता है। वह फिर से simplejson.dumps करने से कैसे बच सकता है? – aatifh

+0

मैंने पाठ को स्पष्ट करने की कोशिश की है, मुझे एहसास है कि यह बहुत स्पष्ट नहीं था। – friism

उत्तर

2

के बाद लेखक का संपादित करें संपादित:

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 है, कृपया यह (मेरे रास्ते का उपयोग परीक्षण करने के लिए एक क्लीनर तरीका है - कि शुरू तार की तलाश में '{' और अंत में '}' बदसूरत है)।

+0

एक अच्छा समाधान की तरह दिखता है, लेकिन पहले '...' में क्या बताया गया है (क्षमा करें, मेरा पायथन बहुत खराब है) – friism

+0

आप ठीक है, यह स्पष्ट नहीं है। मैं संपादित करूंगा। –