将类对象列表保存到 JSON 文件中,以便以后读取

Posted

技术标签:

【中文标题】将类对象列表保存到 JSON 文件中,以便以后读取【英文标题】:Saving a list of class objects to a JSON file that can be later read 【发布时间】:2021-11-14 01:03:47 【问题描述】:

TLDR - 我想将一些变量保存到 JSON 文件中。其中一些是属于自定义类的对象列表。由于 JSON 无法序列化它们,因此会引发错误。我该怎么做?

我正在做一个简单的基于文本的***王牌程序,其中相关类如下:Player(以下子类) 人类 人工智能

卡片

我只编写了大约 3 个月的代码。我的项目代码本身是完全正常的,但我在开始时实现了一个加载选项,在每一轮结束时实现了一个保存选项。

下面是我的配置模块,它包含其他模块访问的所有变量,并包含保存/加载所需的所有内容。

import json

#All variables that need to be accessed between various modules publicly
total_players = 0
players = []
dead_players = []
num_of_humans = 0
num_of_ai = 0
total_cards = 0
cards = []

def save_file():
    save_name = input("Save name (You will use this to load) > ")
    path = 'path_to_dir0.json'.format(save_name)
    data = 
        'total_players' : total_players,
        'players' : players,
        'dead_players' : dead_players,
        'num_of_humans' : num_of_humans,
        'num_of_ai' : num_of_ai,
        'total_cards' : total_cards,
        'cards' : cards
    
    with open(path, 'w+') as f:
        json.dump(data, f)

def load_file():
    load_name = input(f"Enter the name of your save > ")
    path_two = 'path_to_dir0.json'.format(load_name)
    with open(path_two, 'r') as f: 
        sf = json.load(f) 
        total_players = str(sf['total_players'])
        players = str(sf['players'])
        dead_players = str(sf['dead_players'])
        num_of_humans = str(sf['num_of_humans'])
        num_of_ai = str(sf['num_of_ai'])
        total_cards = str(sf['total_card'])
        cards = str(sf['cards'])

这些变量的说明: total_players 是整数形式的玩家总数 玩家是属于 Human 或 Ai 类的对象列表 dead_players 同上 (下面自解释) num_of_humans 是整数 num_of_ai 是 int 总卡数是 int Cards 是 Card 类的对象列表

我的目标是存储所有这些变量的状态,并能够将它们相应地加载到顶部的变量中。在当前状态下,JSON 无法序列化我的自定义类的对象。

【问题讨论】:

【参考方案1】:

在load_file()中,我觉得其实应该是:

total_cards = str(sf['total_cards'])

【讨论】:

如果这修复了代码,您能否将我的回复标记为已接受?谢谢! 嗨,虽然它确实解决了加载中的一个问题(谢谢),但它实际上并没有解决手头的问题。我将在顶部重复 TLDR:我想将一些变量保存到 JSON 文件中。其中一些是属于自定义类的对象列表。由于 JSON 无法序列化它们,因此会引发错误。我该怎么做? @custord 我们无法帮助您,除非您向我们展示您的类是如何定义的,或者至少是它们外观的缩写模式。我建议还研究一下 Python dataclasses,因为它有一个辅助函数 asdict,可用于将数据类实例(包括嵌套的数据类对象)序列化为 dict/JSON 对象。

以上是关于将类对象列表保存到 JSON 文件中,以便以后读取的主要内容,如果未能解决你的问题,请参考以下文章

将包含许多嵌套对象的JSON文件保存到列表中

请教商品列表保存在json文件中,如何在python中读取文件中并保存到字典中

如何从单个文件中读取不同的模式 json 对象并将其保存到表中

使用 C# 中的 ProtoBuf-Net 库将类数据保存到加密文件

将抽象数据类型保存和加载到 json 文件并从游戏中的文件中读取 Haskell

CPP 将类写入/读取到二进制文件中