如何序列化python类?
我有一个模型类定义为如何序列化python类?,python,json,flask,Python,Json,Flask,我有一个模型类定义为 class SiteConfig(object): def __init__(self,command,category,frequency,delay): self.command=command self.category=category self.frequency=frequency self.delay=delay 我从另一个类调用这个模型,比如 from flask impo
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()
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
但我得到的SiteConfig不是JSON可序列化错误
如何在python中序列化类对象
编辑
我尝试使用现有的flaskjson编码器
修改了我的siteconfig类,如
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()
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
然后打电话给我的主要班级,比如
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()
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新手;
谁能提供简单的代码样例来实现这一点? < P>你也可以考虑:
默认情况下,flask使用flask.json.JSONEncoder将对象编码为json。为了对用户定义的类进行jsonification,您需要创建一个JSONEncoder的子类来实现类的序列化。如何实现序列化取决于您,但最简单的方法可能是将您的对象转换为JSONECODER已经知道的内容,如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
}
请参阅以获取类似的示例。查看类序列化-或者,您需要在提供类序列化供json使用的类中创建一个_repr___或_str__方法。@match加载pickled对象可以执行任意代码,所以这并不是你想在web应用程序中使用的东西。@Aran Fey-一般来说是的,但是如果你信任你正在酸洗的东西,并且你真的想通过文本序列化类,那么这可能是唯一的选择。我已经试过你的方法了。我用如何修改类编辑了这个问题。你能告诉我那里的问题吗?@Ratha我的建议是将JSONEncoder本身子类化。您不需要修改自己的类。你能发布一个完整的、可运行的示例来说明这个问题吗?我的原始代码示例就是我最初在问题中发布的方式。我尝试序列化SiteConfig类,它是一个模型类。但是获得JSONSerialError错误的另一个解决方案可能是考虑是否需要自定义类。你能让BuildATGSiteConfig返回一个dict吗?也许这在你的情况下不起作用,如果是这样的话,请忽略此评论@Ratha您发布的代码不能让我重现问题或测试解决方案。请参阅,以获取创建最小、完整、可验证示例的帮助