2016-09-13 4 views
1

У меня есть требование, когда я хотел бы построить много объектов JSON. И есть много разных определений, и в идеале я хочу управлять ими, как классы, и строить объекты и сбрасывать их в JSON по требованию.Класс Python для JSON

Есть ли существующий пакет/рецепт, пусть это мне сделать следующий

Для поддержания его просто позволяет сказать, что мне нужно, чтобы представить людей, которые работают, учатся или оба:

[{ 
    "Name": "Foo", 
    "JobInfo": { 
    "JobTitle": "Sr Manager", 
    "Salary": 4455 
    }, 
    "Name": "Bar", 
    "CourseInfo": { 
    "CourseTitle": "Intro 101", 
    "Units": 3 
}] 

Я бы например, создавать объекты, которые могут выгружать действительный JSON, но создаются как обычные классы python.

Я хотел бы определить свои классы, как модель БД:

class Person: 
    Name = String() 
    JobInfo = Job() 
    CourseInfo = Course() 

class Job: 
    JobTitle = String() 
    Salary = Integer() 

class Course: 
    CourseTitle = String() 
    Units = Integer() 

persons = [Person("Foo", Job("Sr Manager", 4455)), Person("Bar", Course("Intro 101", 3))] 
person_list = list(persons) 
print person_list.to_json() # this should print the JSON example from above 

EDIT

я написал свою собственную мини-рамку для достижения этой. Ее доступны через пип

pip install pymodjson

код и примеры доступны здесь: (MIT) https://github.com/saravanareddy/pymodjson

+2

[Смотрите здесь] (http://stackoverflow.com/questions/3768895/how-to-make-a-class-json-serializable). Для части валидации вам нужно написать собственный 'JSONEncoder'. – Sevanteri

ответ

2

Вы можете создать json тщательно фильтруя из __dict__ объекта.

Рабочий код:

import json 

class Person(object): 
    def __init__(self, name, job=None, course=None): 
     self.Name = name 
     self.JobInfo = job 
     self.CourseInfo = course 

    def to_dict(self): 
     _dict = {} 
     for k, v in self.__dict__.iteritems(): 
      if v is not None: 
       if k == 'Name': 
        _dict[k] = v 
       else: 
        _dict[k] = v.__dict__ 
     return _dict 

class Job(object): 
    def __init__(self, title, salary): 
     self.JobTitle = title 
     self.Salary = salary 

class Course(object): 
    def __init__(self, title, units): 
     self.CourseTitle = title 
     self.Units = units 

persons = [Person("Foo", Job("Sr Manager", 4455)), Person("Bar", Course("Intro 101", 3))] 
person_list = [person.to_dict() for person in persons] 
print json.dumps(person_list) 
Смежные вопросы