Python JSON 引用了子类信息的数据



我有一些JSON数据进来,我几乎可以工作了。 问题是我在记录中有一个记录,我想将数据很好地包装在几个 Python 类中进行编码和解码。

如果我将嵌套的 JSON 数据包装为字符串,但它有效,但实际上不想这样做,因为它似乎是不正确的 JSON。

示例(有效,但我不喜欢它)

{"eventData": "{"itemName": "Dflt"}", "pID": 1}

示例(我想使用的数据)

{"eventData": {"itemName": "Dflt"}, "pID": 1}

如何修改我的代码,这样我就不必将子数据包装在"引号"中

import json
from copy import deepcopy

class Event(object):
    __slots__= 'itemName'
    def __init__(self, itemName):
        self.itemName = itemName

    def encode(self):
        obj = {}
        obj['itemName'] = str(self.itemName)               
        return json.dumps(obj)
    def decode(self, json_Str):
        obj = json.loads(json_Str)
        self.itemName = obj['itemName']        

class EventPacket(object):
    __slots__= 'pID', 'eventData' 
    def __init__(self, pID, eventData):
        self.pID = pID
        self.eventData = eventData
    def encode(self):
        obj = {}
        obj['pID'] = int(self.pID)
        obj['eventData'] = self.eventData.encode()

        return json.dumps(obj)
    def decode(self, json_Str):
        obj = json.loads(json_Str)
        self.pID = obj['pID']
        self.eventData = obj['eventData']

defaultEvent = Event('Dflt')
defaultPacket = EventPacket(1, defaultEvent)

packet = deepcopy(defaultPacket)
print 'packet : ', packet.encode()
tempStr = '{"eventData": "{\"itemName\": \"test\"}", "pID": 2}'
packet.decode(tempStr)
print 'packet : ', packet.encode()
#desired string format
tempStr2 = '{"eventData": {"itemName": "test2"}, "pID": 3}'
packet.decode(tempStr2)
print 'packet : ', packet.encode()

这里有一种方法可以做到这一点。实现to_dictfrom_dict函数,而不是encodedecode函数。在顶层执行 JSON 编码:

import json
class Event(object):
    __slots__= 'itemName'
    def __init__(self, itemName):
        self.itemName = itemName
    def to_dict(self):
        obj = {}
        obj['itemName'] = self.itemName
        return obj
    @classmethod
    def from_dict(cls, obj):
        e = cls(obj['itemName'])
        return e
class EventPacket(object):
    __slots__= 'pID', 'eventData' 
    def __init__(self, pID, eventData):
        self.pID = pID
        self.eventData = eventData
    def to_dict(self):
        obj = {}
        obj['pID'] = int(self.pID)
        obj['eventData'] = self.eventData.to_dict()
        return obj
    @classmethod
    def from_dict(cls, obj):
        ep = cls(obj['pID'])
        ep.eventData = Event.from_dict(obj['eventData'])
        return ep
example_event = Event('Dflt')
example_packet = EventPacket(1, example_event)
json_string = json.dumps(example_packet.to_dict())
recovered_example_packet = EventPacket.from_dict(json.loads(json_string))

最新更新