从文件解码自定义类型

时间:2018-04-23 10:49:11

标签: python json python-3.x object decode

我正在分阶段教自己python,并开始使用JSON来帮助我的基本小项目。 我有一个武器对象

class actionAttack():
    '''
    name    String
    hit     Int            bonus to hit
    dam     Int            damage bonus
    dice    Tuple(0,1)     damage dice xDy
    '''
    def __init__(self, name, hit, dam, diceTuple):
        self.name = name
        self.hit = hit
        self.dam = dam
        self.diceTuple = diceTuple

描述武器的JSON文件:

{
  "__WEAPON__":True,
  "name": "Sword", 
  "hit": 5, 
  "dam": 2, 
  "diceTuple":[2, 6]
}

我根据我正在阅读的教程创建了一个解码器,我有以下内容:

import json


def decode_weapon(dct):
    if '__WEAPON__' in dct:
        return actionAttack(dct["name"], dct["hit"], dct["dam"], dct["diceTuple"])
    return dct

with open('data_test.json') as attack_data:
    data = attack_data.read()
    attackDict = json.loads(data, object_hook=decode_weapon)

编译时,我收到以下错误:

Traceback (most recent call last):
  File "test.py", line 18, in <module>
    attackDict = json.loads(data, object_hook=decode_weapon)
  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 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 15 (char 16)

2 个答案:

答案 0 :(得分:2)

由于json来自java脚本而不是来自Python,因此'True'值是用小写t编写的。

将'True'更改为'true'。

答案 1 :(得分:1)

True不是有效的json对象 - 您可能需要true

更好的方式来标记&#39;您的类型/类的对象可能使用"__class__" : "weapon",那么您将知道所有类都具有"class"属性。 E.g。

{
  "__class__": "weapon",
  "name": "Sword", 
  "hit": 5, 
  "dam": 2, 
  "diceTuple":[2, 6]
}

然后:

def decode_weapon(dct):
    if dct['__class__'] != 'weapon':
        raise ValueError("Not a valid weapon dictionary")
    return actionAttack(dct["name"], dct["hit"], dct["dam"], dct["diceTuple"])