2016-09-02 2 views
1

Вот как я хочу, чтобы мои данные были: (ключ = имя, значение = [д.р., [MISC1, MISC2, ..]])JSON свалка для пользовательского класса в Python

# my sample code 
inputNames = [ 
('james', ['1990-01-19', ['james1', 'james2', 'james3'] ]), 
('julie', ['1991-08-07', ['julie1', 'julie2'] ]), 
('mikey', ['1989-01-23', ['mikey1'] ]), 
('sarah', ['1988-02-05', ['sarah1', 'sarah2', 'sarah3', 'sarah4'] ]) 
] 
class empData (list): 
    def __init__ (self, misc=None): 
      list.__init__([]) 
      # print('add empdata: ',misc[0],misc[1]) 
      self.dob = misc[0] 
      self.extend(misc[1]) 
    def edprint(self): 
      return(self.dob, self) 
class myEmp(): 
    def __init__ (self, anm, amisc=None): 
      self.nm = anm 
      self.details = empData(amisc) 
    def printme(self): 
      print(self.nm, self.details.edprint()) 

emps={} 
for i in inputNames: 
    m = myEmp(i[0],i[1]) 
    emps[m] = m 
print(emps) 
# prints addresses of variables 

# for actual data use the following lines 
for ea in emps:  
    emps[ea].printme() 

try:  
    with open('data.json','w') as wfd: 
      json.dump(emps, wfd)    
except IOError as ioerr: 
      print('File error: ',str(ioerr)) 
wfd.close() 

выше дает мне ошибку: TypeError: ключ < главный .myEmp объект в 0x10143d588> не является строкой Я не могу понять, как сбросить мой Dict структур данных myEmp в формате JSON

+0

Em, не странно, если вы пытаетесь сбросить что-то, что не является стандартным общепринятым типа: Вы создаете свой собственный класс ** myEmp ** так как JSON Cann знаете, как представлять этот объект? Вы можете создать пользовательский JSONEncoder, как говорит doc, или установить skipkeys в значение True, если вы хотите просто передать эту ошибку. –

+0

я сделал это слишком: класс myEmpEncoder (json.JSONEncoder): четкости по умолчанию (я, объект): если isinstance (объект, myEmp): возвращение [obj.nm, obj.details] # Пусть базовый класс по умолчанию используется метод повышения TypeError возврата json.JSONEncoder.default (самоощущение, OBJ) И назвал ее: json.dump (мс, РВД, ЦБС = myEmpEncoder) я все еще получаю ошибку: TypeError:. клавиши <__ __ основной myEmp объект в 0x101bf5940> не является строкой – user6785453

+0

И логично то, что я делаю, это сбрасывание dict моих сотрудников «emps» в JSON. Ключ - это имя сотрудника, а данные сотрудника - произвольный список. Так не должен ли python сбрасывать dict? – user6785453

ответ

0

Перед тем, как можно сбросить до json вам необходимо явно преобразовать ваши данные в сериализуемый тип, например dict или list. Вы можете сделать это, используя список понимание:

>>> d = [{'key':ea.nm, 'value':[ea.details.dob, ea.details]} for ea in emps] 
>>> json.dumps(d) 
'[{"value": ["1991-08-07", ["julie1", "julie2"]], "key": "julie"}, {"value": ["1989-01-23", ["mikey1"]], "key": "mikey"}, {"value": ["1990-01-19", ["james1", "james2", "james3"]], "key": "james"}, {"value": ["1988-02-05", ["sarah1", "sarah2", "sarah3", "sarah4"]], "key": "sarah"}]' 
+0

Это выглядит разумно - I надеялся на метод, который мог бы помочь мне понять, если что-то не так с моим пониманием dict – user6785453

Смежные вопросы