来自JSON的字典中的Python解析字典

2024-04-30 05:03:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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:

# 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__'

我认为它是在试图解析对象中的字典。 如何解析整个对象而不仅仅是子字典?你知道吗


Tags: 对象nameinpyjsondatareturn字典
1条回答
网友
1楼 · 发布于 2024-04-30 05:03:18

我在这里看到的问题是,您总是希望项__class__存在,尽管它没有发生。你知道吗

使用您提供的json数据,函数decode_character将被调用两次:

  • 一个是根json对象数据。使用键__class__namelevel
  • 再次使用内部json对象数据。使用键ACSTR

我不知道您对代码的期望是什么,但我会将dct['__class__']更改为dct.get('__clas__'),这样就不会出现键错误。你知道吗

Here您可以看到一个示例。你知道吗

相关问题 更多 >