以 JSON 格式创建和检索数据
Creating and retrieving data in JSON format
我正在制作一个允许您赌博的程序,它会创建一个玩家对象,其属性包括当前金钱、玩家有多少 wins/losses 等。
我目前能够运行此程序,并且在程序 运行ning 时保存信息,但是我想实现一项功能,允许我将此用户信息保存在 json 然后下次程序是 运行 时,检查 json 以查看玩家输入的名称是否与 json 中 'name' 的任何值相匹配并提取他们的个人资料从他们上次玩的时候开始。
目前我正在学习如何 read/write json 数据,我能够将数据保存到 json,但我无法将其保存为 json 的格式我想要稍后检索它,并将数据转换回我的具有属性的对象。具体来说,我可以这样保存用户:
import json
class Casino:
def __init__(self, name, money, wins, debt):
self.name = str(name)
self.money = int(money)
self.wins = int(wins)
self.debt = int(debt)
self.is_gambling = True
self.losses = 0
def add_win(self):
self.wins = self.wins + 1
def add_loss(self):
self.losses = self.losses + 1
def add_money(self, bet: int):
self.money = self.money + bet
def add_debt(self, debt: int):
if self.money == 0:
print("You have gone into debt..")
print("Your debt has gone up")
self.debt = self.debt + debt
else:
print("Your debt has gone up")
self.debt = self.debt + debt
def change_name(self, newname):
self.name = newname
return self.name
def indebt(self):
if self.debt > 0:
print('You are in debt..')
print(f'You owe ${self.debt}')
else:
print('You are not in debt')
def addrep(self, rep: int):
self.reputation = self.reputation + rep
return self.reputation
def remrep(self, rep: int):
self.reputation = self.reputation - rep
return self.reputation
player2 = {
'name': 'dolorean',
'money': 0,
'wins': 0,
'debt': 0
}
show = json.dumps(player2)
with open('test.json', 'w') as userfile:
json.dump(show, userfile)
它会像这样保存到 json:
"{\"name\": \"dolorean\", \"money\": 0, \"wins\": 0, \"debt\": 0}"
但我想通过用户名检索属性。
我是否需要在 json 中创建某种嵌套列表?如果我这样做,我该怎么做?我尝试将播放器变量更改为:
player2 = {
'name': 'dolorean',
'money': 0,
'wins': 0,
'debt': 0
}
至:
player2 = {
'users': {
'name': 'dolorean',
'money': 0,
'wins': 0,
'debt': 0
}
}
但我不确定如何检索数据,所以它只是以一种对我来说看起来不同的方式保存它..
此数据结构将允许许多不同的玩家名称:
{
"jim": {"money": 100, "wins": 5, "debt": 0},
"betty": {"money": 200, "wins": 7, "debt": 5}
}
好的,所以我从 martineau 的评论中得到的解决方案是这样做的:
我将使用输入功能生成一个名称(只是暂时的,我将其添加到一个不和谐的机器人中,所以最终名称将是他们的服务器显示名称,他们的文件名将是他们唯一的服务器 ID,这样我就可以保存他们的信息到他们的文件),我从该输入中创建以下对象并将其转换为 json 格式,然后将其转换回来。
gam_name = str(input('What is your name?'))
player1 = Casino(gam_name, 500, 0, 0)
player1 = {
'name': gam_name,
'money': player1.money,
'wins': player1.wins,
'debt': player1.debt
}
with open(gam_name + '.json', 'w') as userfile:
json.dump(player1, userfile)
with open(gam_name + '.json') as userfile:
info = json.load(userfile)
print(info['name'])
print(info['money'])
print(info['wins'])
print(info['debt'])
现在,通过这种方式,我可以将每个值保存为当前值,我可以 运行 无论他们赢了还是输了,它都会用新值覆盖当前值,然后关闭文件它是使用 with 语句完成的。
这正是我想要做的,现在我可以从特定于玩家的唯一文件中调用信息,这将允许两个人拥有相同的显示名称或用户名,但信息不同。
感谢您的帮助!
我正在制作一个允许您赌博的程序,它会创建一个玩家对象,其属性包括当前金钱、玩家有多少 wins/losses 等。
我目前能够运行此程序,并且在程序 运行ning 时保存信息,但是我想实现一项功能,允许我将此用户信息保存在 json 然后下次程序是 运行 时,检查 json 以查看玩家输入的名称是否与 json 中 'name' 的任何值相匹配并提取他们的个人资料从他们上次玩的时候开始。
目前我正在学习如何 read/write json 数据,我能够将数据保存到 json,但我无法将其保存为 json 的格式我想要稍后检索它,并将数据转换回我的具有属性的对象。具体来说,我可以这样保存用户:
import json
class Casino:
def __init__(self, name, money, wins, debt):
self.name = str(name)
self.money = int(money)
self.wins = int(wins)
self.debt = int(debt)
self.is_gambling = True
self.losses = 0
def add_win(self):
self.wins = self.wins + 1
def add_loss(self):
self.losses = self.losses + 1
def add_money(self, bet: int):
self.money = self.money + bet
def add_debt(self, debt: int):
if self.money == 0:
print("You have gone into debt..")
print("Your debt has gone up")
self.debt = self.debt + debt
else:
print("Your debt has gone up")
self.debt = self.debt + debt
def change_name(self, newname):
self.name = newname
return self.name
def indebt(self):
if self.debt > 0:
print('You are in debt..')
print(f'You owe ${self.debt}')
else:
print('You are not in debt')
def addrep(self, rep: int):
self.reputation = self.reputation + rep
return self.reputation
def remrep(self, rep: int):
self.reputation = self.reputation - rep
return self.reputation
player2 = {
'name': 'dolorean',
'money': 0,
'wins': 0,
'debt': 0
}
show = json.dumps(player2)
with open('test.json', 'w') as userfile:
json.dump(show, userfile)
它会像这样保存到 json:
"{\"name\": \"dolorean\", \"money\": 0, \"wins\": 0, \"debt\": 0}"
但我想通过用户名检索属性。
我是否需要在 json 中创建某种嵌套列表?如果我这样做,我该怎么做?我尝试将播放器变量更改为:
player2 = {
'name': 'dolorean',
'money': 0,
'wins': 0,
'debt': 0
}
至:
player2 = {
'users': {
'name': 'dolorean',
'money': 0,
'wins': 0,
'debt': 0
}
}
但我不确定如何检索数据,所以它只是以一种对我来说看起来不同的方式保存它..
此数据结构将允许许多不同的玩家名称:
{
"jim": {"money": 100, "wins": 5, "debt": 0},
"betty": {"money": 200, "wins": 7, "debt": 5}
}
好的,所以我从 martineau 的评论中得到的解决方案是这样做的:
我将使用输入功能生成一个名称(只是暂时的,我将其添加到一个不和谐的机器人中,所以最终名称将是他们的服务器显示名称,他们的文件名将是他们唯一的服务器 ID,这样我就可以保存他们的信息到他们的文件),我从该输入中创建以下对象并将其转换为 json 格式,然后将其转换回来。
gam_name = str(input('What is your name?'))
player1 = Casino(gam_name, 500, 0, 0)
player1 = {
'name': gam_name,
'money': player1.money,
'wins': player1.wins,
'debt': player1.debt
}
with open(gam_name + '.json', 'w') as userfile:
json.dump(player1, userfile)
with open(gam_name + '.json') as userfile:
info = json.load(userfile)
print(info['name'])
print(info['money'])
print(info['wins'])
print(info['debt'])
现在,通过这种方式,我可以将每个值保存为当前值,我可以 运行 无论他们赢了还是输了,它都会用新值覆盖当前值,然后关闭文件它是使用 with 语句完成的。
这正是我想要做的,现在我可以从特定于玩家的唯一文件中调用信息,这将允许两个人拥有相同的显示名称或用户名,但信息不同。
感谢您的帮助!