如何序列化python类?

时间:2018-02-04 22:20:58

标签: 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 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的新手; 谁能提供关于如何实现这个的简单代码示例?

2 个答案:

答案 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)