I wrote this code to save and load an object into JSON. I faced to this error when I accessed into attribute:
I use python json class to serialize the object and deserialize it.
AttributeError: 'dict' object has no attribute 'weeknumber'
# -*- coding: utf-8 -*-
import pickle
import pprint
from datetime import date
import datetime
import decimal
import json
class Jsonable(object):
def __iter__(self):
for attr, value in self.__dict__.iteritems():
if isinstance(value, datetime.datetime):
iso = value.isoformat()
yield attr, iso
elif isinstance(value, decimal.Decimal):
yield attr, str(value)
elif(hasattr(value, '__iter__')):
if(hasattr(value, 'pop')):
a = []
for subval in value:
if(hasattr(subval, '__iter__')):
a.append(dict(subval))
else:
a.append(subval)
yield attr, a
else:
yield attr, dict(value)
else:
yield attr, value
class MyCalendar(Jsonable):
year = 0
weeks = {}
def __init__(self, _year,_weeks):
self.year = _year
self.weeks = _weeks;
class MyWeek(Jsonable):
weeknumber = 0
days = {}
def __init__(self, _week,_days):
self.weeknumber = _week
self.days = _days
class MyDay(Jsonable):
daynumber = 0
courses = {}
def __init__(self, _day,_courses):
self.daynumber = _day
self.courses = _courses
class MyCourse(Jsonable):
id = 0
title = ''
def __init__(self, _id,_title):
self.id = _id
self.title = _title
def init():
_myc = MyCalendar(date.today().year,[]);
for wi in range(0, 52):
_week = MyWeek(wi,[])
for di in range(0, 5):
_day = MyDay(di,[])
for ci in range(0, 4):
_course = MyCourse(ci,"empty")
_day.courses.append(_course)
_week.days.append(_day)
_myc.weeks.append(_week)
return _myc
def save(_t):
with open('data2.txt', 'w') as outfile:
json.dump(dict(_t), outfile)
def load():
_t = init();
with open('data2.txt', 'r') as infile:
_t.__dict__ = json.loads(infile.read())
return _t
def setCourse(_t,_weeknumnber,_dayumber,_course,_title):
_t.weeks[_weeknumnber].days[_dayumber].courses[_course].title = _title
return _t
_mycal = init();
setCourse(_mycal,1,2,3,"Python");
save(_mycal)
_mycal = load()
pprint.pprint( _mycal.weeks[1].weeknumber)