嵌套类的JSON序列化和反序列化

4

X 是一个拥有3个字段的简单类:

class X():
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

针对X的JSON编码器/解码器:

class XEncoder(json.JSONEncoder):
    def encode(self, obj):
        return super(XEncoder, self).encode({
            'a': obj.a,
            'b': obj.b,
            'c': obj.c
        })

class XDecoder(json.JSONDecoder):
    def decode(self, json_string):
        obj = super(XDecoder, self).decode(json_string)
        return X(obj['a'], obj['b'], obj['c'])

Y类中有一个字段,其中包含一个字典,字典中的一个键值对的键为X

class Y():
    def __init__(self):
        self.m = {}

    def add(self, a, x):
        self.m[a] = x

JSON编码/解码器在Y中会是什么样子?

2
我敢打赌,一个健全的JSON库可以直接编码字典。 - millimoose
解码需要多少费用? - ДМИТРИЙ МАЛИКОВ
你已经从解码器中获得了字典。 (您可能需要使用类似于“self.m = {k:XDecoder()。decode(v)for k,v in super()。decode(json_string)} ['m'] .items()”的映射和解码值来解码它们) - millimoose
1个回答

1
class YEncoder(json.JSONEncoder):
    def encode(self, obj):
        return json.dumps({ 'm': json.dumps({ k: json.dumps(v, cls=XEncoder) for k, v in obj.m.items()})})

class YDecoder(json.JSONDecoder):
    def decode(self, json_string):
        y.m = {k: json.loads(v, cls=XDecoder) for k, v in json.loads(json.loads(json_string)['m']).items()}
        return y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接