سؤال

لدي كائن نموذج 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 كسلسلة بسيطة، على الرغم من أنها جميلة تم إنشاؤها مسبقا. يتم إصلاح هذا بسهولة في العميل من قبل eval()'جي سلسلة المنطقة، ولكن أود أن أفعل ذلك مناسبة. يمكن أن أقول simplejson أن سلسلة معينة هي بالفعل JSON ويجب استخدامها كما هي (وعدم إرجاعها كسلسلة بسيطة)؟ أم أن هناك حل آخر؟

تحديثفقط للتوضيح، هذا هو JSON عاد حاليا:

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

التحدي هو الحصول على "منطقة" أن تكون قاموس JSON بدلا من سلسلة بسيطة.

هل كانت مفيدة؟

المحلول

تم التعديل بعد تحرير المؤلف:

يمكنك أن تفعل شيئا مثل هذا:

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

نصائح أخرى

أعتقد أن الطريقة النظيفة للقيام بذلك هي من خلال تمديد 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، من فضلك استخدمه (طريقي - يبحث عن سلاسل تبدأ في "{" ونهاية "}" قبيحة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top