I have a complex class object that I am trying to convert to a json array. It works, but the json is double quoted. I tried to make the class serializable using json.dumps and this function is converting it to a string.
import datetime as dt
import json
class StatusDetails:
def __init__(self, Description, Value):
self.Description = Description
self.Value = Value
def toJSON(self):
return json.dumps(self, default=lambda o:o.__dict__)
class OrderRef:
def __init__(self, ID, Name):
self.ID = ID
self.Name = Name
def toJSON(self):
return json.dumps(self, default=lambda o:o.__dict__) #this converts the OrderRef object to a String literal
class WorkOrder:
def __init__(self, statusDetails, orderRef, RequestedDate):
self.RequestedDate = RequestedDate
self.StatusDetails = statusDetails
self.OrderRef= orderRef
listOfWO = []
_statusDetails = StatusDetails("OPEN", "OPEN").toJSON()
_orderRef = OrderRef('12345', 'SOME VALUE').toJSON()
_requestedDate = dt.datetime.now('US/Central').isoformat()
_wo = WorkOrder(_statusDetails , _orderRef , _requestedDate )
listOfWO.append(_wo)
_WorkOrderString = json.dumps([ob.__dict__ for ob in listOfWO]) #_orderRef and __statusDetails are literal json strings rather than json objects; how do I get the _statusDetails and _orderRef as json objects than as literal strings?
print('posting workorder json: \n' _WorkOrderString )
CodePudding user response:
Make a Jsonable
mix-in class and a custom JSONEncoder.
import datetime as dt
import json
from zoneinfo import ZoneInfo
# "pip install tzdata" for timezone support if needed
class Jsonable:
def toJSON(self):
return self.__dict__
class JsonableEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Jsonable):
return obj.toJSON()
return super().default(obj)
class StatusDetails(Jsonable):
def __init__(self, Description, Value):
self.Description = Description
self.Value = Value
class OrderRef(Jsonable):
def __init__(self, ID, Name):
self.ID = ID
self.Name = Name
class WorkOrder(Jsonable):
def __init__(self, statusDetails, orderRef, RequestedDate):
self.RequestedDate = RequestedDate
self.StatusDetails = statusDetails
self.OrderRef = orderRef
listOfWO = []
_statusDetails = StatusDetails('OPEN', 'OPEN')
_orderRef = OrderRef('12345', 'SOME VALUE')
_requestedDate = dt.datetime.now(ZoneInfo('US/Central')).isoformat()
_wo = WorkOrder(_statusDetails, _orderRef, _requestedDate)
listOfWO.append(_wo)
_WorkOrderString = json.dumps(listOfWO, cls=JsonableEncoder)
print(_WorkOrderString)
Output:
[{"RequestedDate": "2023-01-20T14:32:23.181151-06:00", "StatusDetails": {"Description": "OPEN", "Value": "OPEN"}, "OrderRef": {"ID": "12345", "Name": "SOME VALUE"}}]
CodePudding user response:
_wo = WorkOrder(json.loads(_statusDetails) , json.loads(_orderRef) , _requestedDate )
this fixed my problem. Decoded json strings into dictionaries and then converted it to json.