سؤال

لدي وجهة نظر بسيطة أنني أستخدمها لتجربة Ajax.

def get_shifts_for_day(request,year,month,day):

    data= dict()
    data['d'] =year
    data['e'] = month
    data['x'] = User.objects.all()[2]

    return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')

هذا إرجاع ما يلي:

TypeError at /sched/shifts/2009/11/9/

<User: someguy> is not JSON serializable

إذا قمت بإخراج خط البيانات ['x'] حتى لا أشير إلى أي نماذج تعمل وإرجاع هذا:

{"e": "11", "d": "2009"}

لماذا لا يمكن تحليل Simplejson الخاص بي واحدة من نماذج Django الافتراضية؟ أحصل على نفس السلوك مع أي نموذج أستخدمه.

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

المحلول

تحتاج فقط إلى إضافة، في حياتك .dumps اتصل، أ default=encode_myway حجة للدعاية simplejson تعرف ماذا تفعل عند تمرير بيانات تكنولوجيا المعلومات التي لا تعرف أنواعها - الإجابة على "لماذا" سؤالك هو بالطبع لم تفعل ذلك أخبر مسكين simplejson ما يجب القيام به مع أحد حالات النماذج الخاصة بك.

وبالطبع تحتاج إلى الكتابة encode_myway لتوفير بيانات JSON غير القابلة للتشفير، على سبيل المثال:

def encode_myway(obj):
  if isinstance(obj, User):
    return [obj.username,
            obj.firstname,
            obj.lastname,
            obj.email]
    # and/or whatever else
  elif isinstance(obj, OtherModel):
    return [] # whatever
  elif ...
  else:
    raise TypeError(repr(obj) + " is not JSON serializable")

في الأساس، يعلم JSON عن أنواع البيانات الابتدائية للغاية (السلاسل والمغادرة والعوامات، وتجميعها في مجال الإصابات والقوائم) - إنها مسؤوليتك كمبرمج تطبيق لتتناسب مع كل شيء آخر في / من أنواع البيانات الأولية، وفي simplejson هذا يحدث عادة من خلال وظيفة مرت إليها default= في dump أو dumps زمن.

بدلا من ذلك، يمكنك استخدام json Serializer هذا جزء من Django، انظر المستندات.

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