python自定义JSON编码器/解码器未按预期工作

2024-09-29 23:17:18 发布

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

我正在尝试对嵌套对象进行编码/解码,我将嵌套对象的列表作为字符串而不是JSON对象。在

class A:
    def __init__ (self, n, a):
        self.n = n
        self.a = a

class B:
    def __init__ (self, b, listOfA):
        self.b = b
        self.listOfA = []
        for a in listOfA:
            self.listOfA.append(a)

class AEncoder:
    def default (self, obj):
        if isinstance (obj, A):
            return {
                'n' : obj.n
                'a' : obj.a
            }
        return json.JSONEncoder.default(self, obj)

class BEncoder:
    def default (self, obj):
        if isinstance (obj, B):
            return {
                'b' : obj.n
                'listOfA' : json.dumps(obj.listOfA, cls=AEncoder)
            }
        return json.JSONEncoder.default(self, obj)

listOfA = [A('n1', 'a1'), A('n2', 'a2')]
tmpB = B('b', listOfA)

对于对象A,它工作正常,因为它是相当直接的。B的输出如下:

^{pr2}$

你知道我哪里错了吗?输出应如下所示:

{
    "b" : "b"
    "listOfA" : [{"n" : "n1", "a" : "a1"}, {"n" : "n2", "a" : "a2"}]
}

Tags: 对象selfjsonobjdefaultreturnifinit
1条回答
网友
1楼 · 发布于 2024-09-29 23:17:18

你的代码有一些打字错误,字典里没有逗号,当你在BEncoder中指的是obj.b时,你引用了obj.n。在

除此之外,问题是你正在使用json.dumps文件()在长椅上。此方法返回一个格式正确的json字符串。然后BEncoder看到这个字符串,并认为您希望listOfA的值是一个字符串,然后应该为json正确地编码,从而得到您看到的字符转义。在

这里有一个解决方案,不是返回字符串,而是根据编码器的需要返回“可序列化对象”(例如,list、dict等)。它正在用AEncoder().default()返回的字典(serializable)生成一个列表(可序列化)。在

import json
from json import JSONEncoder

class A:
    def __init__ (self, n, a):
        self.n = n
        self.a = a

class B:
    def __init__ (self, b, listOfA):
        self.b = b
        self.listOfA = []
        for a in listOfA:
            self.listOfA.append(a)

class AEncoder(JSONEncoder):
    def default (self, obj):
        if isinstance (obj, A):
            return { 'n' : obj.n, 'a' : obj.a }
        return json.JSONEncoder.default(self, obj)

class BEncoder(JSONEncoder):
    def default (self, obj):
        if isinstance (obj, B):
            a = AEncoder()
            return { 'b' : obj.b, 'listOfA' : [a.default(x) for x in obj.listOfA] }
        return json.JSONEncoder.default(self, obj)

listOfA = [A('n1', 'a1'), A('n2', 'a2')]
tmpB = B('b', listOfA)
print(json.dumps(tmpB, cls=BEncoder))

输出:

^{pr2}$

相关问题 更多 >

    热门问题