我有一个模型类定义为;
class SiteConfig(object):
def __init__(self,command,category,frequency,delay):
self.command=command
self.category=category
self.frequency=frequency
self.delay=delay
我从另一个类调用此模型,如;
from flask import Flask,request,jsonify
import httplib
from models.SiteConfig import *
app = Flask(__name__)
@app.route('/')
def index():
return "Endpoint is not configured", 500
@app.route('/SitePollingConfiguration',methods=['GET'])
def SitePollingConfiguration():
response = jsonify(statusCode=httplib.OK, config=BuildSiteConfig())
response.status_code = httplib.OK
return response
def BuildSiteConfig():
a= SiteConfig('20c','1',60,60)
print (a)
return a
if __name__ == '__main__':
app.run()
但是我得到 SiteConfig不是JSON可序列化的错误。
如何在python中序列化类对象?
修改 我尝试使用现有的flask json编码器;
修改了我的siteconfig类,如;
from flask import Flask, jsonify
from flask.json import JSONEncoder
class JsonSerializable(object):
def toJson(self):
return JSONEncoder.default(self.__dict__)
class SiteConfig(JsonSerializable):
def __init__(self,command,category,frequency,delay):
self.command=command
self.category=category
self.frequency=frequency
self.delay=delay
然后在我的主要课程中调用,如;
def ATGSitePollingConfiguration():
response = jsonify(statusCode=httplib.OK, config=BuildATGSiteConfig())
response.status_code = httplib.OK
return response
def BuildATGSiteConfig():
a= SiteConfig('20c','1',60,60)
print (a)
return a
但仍然是可序列化的问题。对不起我是python的新手; 谁能提供关于如何实现这个的简单代码示例?
答案 0 :(得分:1)
默认情况下,flask使用flask.json.JSONEncoder
将对象编码为JSON。为了jsonify
用户定义的类,您需要创建一个JSONEncoder
的子类来实现类的序列化。如何实现序列化取决于您,但最简单的方法可能是将您的对象转换为JSONEncoder
已经知道的内容(如dict
)。
尝试将此代码添加到您的应用中。 (您应该使用您发布的SiteConfig
类的第一个版本,而不是您修改过的版本。
from flask.json import JSONEncoder
# A customized JSON encoder that knows about your SiteConfig class
class CustomJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, SiteConfig):
return obj.__dict__
return JSONEncoder.default(self, obj)
# Tell your flask app to use your customised JSON encoder
app.json_encoder = CustomJSONEncoder
有了这个,你应该得到回应:
{
"config": {
"category": "1",
"command": "20c",
"delay": 60,
"frequency": 60
},
"statusCode": 200
}
有关类似示例,请参阅here。
答案 1 :(得分:0)
您也可以考虑jsonpickle:
import jsonpickle
frozen = jsonpickle.encode(a)