JSONDecodeError排查:Python图书管理程序读取JSON文件报错
问题分析与解决办法
首先,咱们来聊聊你遇到的问题根源:你的storage.json文件内容不是合法的JSON格式!JSON规范要求根节点只能是单个对象或者数组,而你现在是把多个独立的JSON对象直接堆在文件里,就像这样:
{ "name": "Lord of The Rings", "author": "J.R.R Tolkien" } { "name": "Harry Potter", "author": "J.K Rowling" }
这种写法JSON解析器完全认不出来,所以当你用json.loads(x)读取第二行的时候,解析器本来等着读取属性名,结果看到了新的{符号,直接就报错了。
为啥会变成这样呢?因为你的add_book()函数每次调用时,都是用json.dump(book, storage)以追加模式('a')写入文件,每次只写一个单独的JSON对象,根本没把它们包裹成一个合法的数组结构。
一步步修复你的代码
1. 修正add_book(),正确存储图书数组
我们需要每次添加图书时,先把文件里已有的图书列表读出来,把新图书加进去,再整个数组写回文件:
import json def add_book(): book = { 'name': input('Enter a book name: '), 'author': input('Enter the author: ') } # 尝试读取现有数据,文件不存在或为空就用空数组 try: with open('storage.json', 'r') as storage: books = json.load(storage) except (FileNotFoundError, json.JSONDecodeError): books = [] # 把新图书加入列表 books.append(book) # 写入文件时用indent参数让JSON格式更美观 with open('storage.json', 'w') as storage: json.dump(books, storage, indent=4)
2. 修正list_books(),美观打印图书列表
现在文件里是合法的JSON数组了,我们可以直接读取整个数组,然后遍历打印:
def list_books(): try: with open('storage.json', 'r') as storage: books = json.load(storage) if not books: print("No books in the library yet!") return # 格式化打印每本图书 print("=== Library Book List ===") for idx, book in enumerate(books, 1): print(f"Book {idx}:") print(f" Name: {book['name']}") print(f" Author: {book['author']}") print("------------------------") except (FileNotFoundError, json.JSONDecodeError): print("No books in the library yet!")
3. 修复现有无效的storage.json
你现在的storage.json是无效格式,得手动改成合法的数组:
[ { "name": "Lord of The Rings", "author": "J.R.R Tolkien" }, { "name": "Harry Potter", "author": "J.K Rowling" }, { "name": "The Adventures of Huckleberry Finn", "author": "Mark Twain" } ]
做完这些修改后,你的程序就能正常读取并美观打印图书列表啦!
内容的提问来源于stack exchange,提问作者Noobmaster
相关产品推荐
相关产品推荐

