باستخدام Python SimpleJson للعودة مؤشر JSON
-
19-09-2019 - |
سؤال
لدي كائن نموذج 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، من فضلك استخدمه (طريقي - يبحث عن سلاسل تبدأ في "{" ونهاية "}" قبيحة).