Словарь разбора Python внутри словаря из JSON - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть файл json, который содержит объект со словарем внутри него:

{
   "__class__": "monster",
   "name": "Mugger",
   "level": 1,
   "hpTotal": 20,
   "attacks": ["Sword", "Knife"],
   "stats": {
       "AC": 12,
       "STR": 11,
       "DEX": 12,
       "CON": 12,
       "INT": 10,
       "WIS": 10,
       "CHA": 10
   }
}

Я загружаю его следующей функцией:

def loadCharacters(fileLoc):
    with open(fileLoc) as character_data:
        data = character_data.read()
        characterDictionary = json.loads(data, object_hook=decode_character)
    return characterDictionary 

Когда я анализирую его через мойДекодер выдает мне KeyError на основе Class:

# Decode characters based on class
def decode_character(dct):
    if dct['__class__'] == 'npc':
        return character(dct["name"], dct["level"], dct["hpTotal"])
    if dct['__class__'] == 'monster':
        return monster(dct["name"], dct["level"], dct["hpTotal"], dct["attacks"], dct["stats"])
    raise ValueError("Not a valid character dictionary")

Отчет о трассировке:

Traceback (most recent call last):
  File "C:\SRC\Testing\ImportCharacters.py", line 14, in <module>
    characterRoster = loadCharacters(characterFileLoc)
  File "C:SRC\Characters\LoadCharacter.py", line 30, in loadCharacters
    characterDictionary = json.loads(data, object_hook=decode_character)
  File "C:\Python36\lib\json\__init__.py", line 367, in loads
    return cls(**kw).decode(s)
  File "C:\Python36\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python36\lib\json\decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
  File "C:\SRC\Characters\LoadCharacter.py", line 12, in decode_character
    if dct['__class__'] == 'npc':
KeyError: '__class__'

Я думаю, что он пытается разобрать словарь в объекте.Как мне разобрать весь объект, а не только под словарь?

1 Ответ

0 голосов
/ 25 апреля 2018

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

С предоставленными вами данными json функция decode_character будет вызвана дважды:

  • Один с корневыми данными объекта json.С ключами __class__, name, level и т. Д.
  • Еще раз с внутренними данными объекта json.С ключами AC, STR и т. Д.

Я действительно не знаю, что вы ожидаете от своего кода, но я бы изменил dct['__class__'] для dct.get('__clas__'), чтобы KeyError неВозник.

Здесь Вы можете увидеть пример.

...