You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:32:52