Search code examples
pythonjsonclassinstance

saving class instances with json file - Python


This is the class I am currently using

class Book:
   def __init__(self, title: str, author: str, isbn: int, genre: str, numCopies: int):
      self._title = title
      self._author = author
      self._isbn = isbn
      self._genre = genre
      self._numCopies = numCopies


   def __str__(self):  # all the properties of the class Book()
      return f'Title: {self._title}\nAuthor: {self._author}\nISBN: {self._isbn}\nGenre: {self._genre}\nNumber Of Copies: {self._numCopies}\n'

json file format is given to me like this:

[
  {
    "title": "How to love",
    "author": "vagabondage3",
    "isbn" : 9832,
    "genre" : "Comedy",
    "numofcopies" : 2
  },
  {
    "title": "How to eat",
    "author": "belabor",
    "isbn" : 2345,
    "genre" : "Documentary",
    "numofcopies" : 3
  }
]

the objective is to create a class instance book = Book("title","author",0,"genre",0) and then append it to the json file like this:

[
  {
    "title": "How to love",
    "author": "vagabondage3",
    "isbn" : 9832,
    "genre" : "Comedy",
    "numofcopies" : 2
  },
  {
    "title": "How to eat",
    "author": "belabor",
    "isbn" : 2345,
    "genre" : "Documentary",
    "numofcopies" : 3
  },
  {
    "title": "title",
    "author": "author",
    "isbn" : 0,
    "genre" : "genre",
    "numofcopies" : 0
   }
]

And to be fair I saw similar solutions but I can't fully understand anything


Solution

  • You can use json.loads to get a dictionary from JSON, and then add a new object as in a regular dictionary.

    class Book:
        def __init__(self, title: str, author: str, isbn: int, genre: str, numCopies: int):
          ...
    
        def get_dict(self):
            dict_obj = {
                "title": self._title,
                "author": self._author,
                "isbn" : self._isbn,
                "genre" : self._genre,
                "numofcopies" : self.__numCopies
                }
    
            return dict_obj
    

    Now it is enough to call the get_dict method to get the dictionary, and through "append", add it to the list.

    if __name__ == '__main__':
        with open('your.json', 'r') as f:
            books_json = f.read()
    
        books = json.loads(books_json)
        book = Book('title', 'author', 0, 'genre', 0)
        books.append(book.get_dict())
    
        with open('your.json', 'w') as f:
            f.write(json.dumps(books))