如何序列化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您发布的代码不能让我重现问题或测试解决方案。请参阅,以获取创建最小、完整、可验证示例的帮助