我有一些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_dict
和from_dict
函数,而不是encode
和decode
函数。在顶层执行 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))