Чтение файла JSON и создание объектов из него - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть программа, которая случайным образом генерирует 10 символов RPG.Я реализовал возможность сохранять их в characterFile.json, вот что содержится в этом файле:

[
{
    "health": 100,
    "name": "da fu en ",
    "power": 30,
    "sAttackPwr": 60,
    "speed": 10,
    "type": "Elf"
},
{
    "health": 100,
    "name": "tuk ar da ",
    "power": 90,
    "sAttackPwr": 40,
    "speed": 50,
    "type": "Dragon"
},
{
    "health": 100,
    "name": "tuk el low ",
    "power": 30,
    "sAttackPwr": 60,
    "speed": 10,
    "type": "Elf"
},
{
    "health": 100,
    "name": "ant en ant ",
    "power": 90,
    "sAttackPwr": 40,
    "speed": 50,
    "type": "Dragon"
},
{
    "health": 100,
    "name": "tuk en el ",
    "power": 90,
    "sAttackPwr": 40,
    "speed": 50,
    "type": "Dragon"
},
{
    "health": 100,
    "name": "ar da ar ",
    "power": 90,
    "sAttackPwr": 40,
    "speed": 50,
    "type": "Dragon"
},
{
    "health": 100,
    "name": "kar ing tuk ",
    "power": 30,
    "sAttackPwr": 60,
    "speed": 10,
    "type": "Elf"
},
{
    "health": 100,
    "name": "da cha ing ",
    "power": 50,
    "sAttackPwr": 70,
    "speed": 30,
    "type": "Wizard"
},
{
    "health": 100,
    "name": "da cha low ",
    "power": 50,
    "sAttackPwr": 70,
    "speed": 30,
    "type": "Wizard"
},
{
    "health": 100,
    "name": "da cha tuk ",
    "power": 30,
    "sAttackPwr": 60,
    "speed": 10,
    "type": "Elf"
}
]

(форматирование, когда я вставляю его в SO, неправильное, но как оно изложенов файле правильно)

Я хотел бы иметь возможность читать это обратно в программу, создавая объекты из этого списка.

Это то, что у меня есть до сих пор для чтения файлаобратно в программу:

def openCharsToFile(gameChars):
    print("Loading File...")
    ans = input("Please ensure the file is called 'characterFile.json', then press [1]...")
    while True:
        if ans == "1":
            with open("characterFile.json") as read_file:
                data = json.load(read_file)
                print(data)
                for x in data:
                    gameChars = characterClass(data[x][name], data[x][type], data[x][health], data[x][power], data[x][sAttackPwr], data[x][speed])

    break

characterClass - это класс, который я использую для создания экземпляра объекта:

# Base Class for creating an RPG character
class character:
    # __init__ method, creates the name, type, health properties
    def __init__(self, charName, charType, charHealth):
        self.name = charName
        self.type = charType
        self.health = charHealth


class characterClass(character):
    def __init__(self, charName, charType, charHealth, charPower, charSAttackPwr, charSpeed):
        character.__init__(self, charName, charType, charHealth)
        self.power = charPower
        self.sAttackPwr = charSAttackPwr
        self.speed = charSpeed

Когда я запускаю этот код, я получаю следующую ошибку:

TypeError: list indices must be integers or slices, not dict

Теперь, как я понимаю, эта ошибка заключается в том, что я пытаюсь найти индекс в списке, но вместо этого отправляю ему весь словарь, который не может превратиться в целое число

Чего мне не хватает, чтобы использовать цикл для считывания этого обратно в мою программу?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

х - не индекс, а сам диктат.Цикл for повторяется для каждой записи, загруженной в данные из файла JSON.Правильная строка кода должна быть:

gameChars = characterClass(x['name'], x['type'], x['health'], x['power'], x['sAttackPwr'], x['speed'])

0 голосов
/ 25 ноября 2018

Здесь x - это действительный символьный дикт, а не индекс:

for x in data:

Вместо этого попробуйте что-то вроде этого:

for character in data:
    gameChars = characterClass(character['name'], character['type'], character['health'], character['power'], character['sAttackPwr'], character['speed'])

Я также добавил здесь пропущенные кавычки, иЯ бы порекомендовал использовать более описательное имя, чем data.Как насчет characters?Классы Python обычно именуются с помощью CamelCase, поэтому Character и CharacterClass могут быть лучше имен, чем character и characterClass. Официальное руководство по стилю Python может быть полезным здесь.

Наконец, я не думаю, что вам нужно это break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...