3

我试图拥有一个体面的业务层,即服务器端。将每个新业务类存储在数据库中的工作量可能会减少。

但是,它不能很好地执行到 json 的转换。它适用于简单的 python 对象,使用json.dumps(self.__dict__). 但是一个简单的 python 对象列表并不能很好地序列化为 json。

当我尝试对列表执行 json 序列化时,return json.dumps([x.to_json() for x in self.my_list_items])它会输出附加的双引号,并为列表中的每个项目输出 \":["{\"completed\": 0, \"id\": 1, \"name\": \"labelOne\"}", "{\"completed\": 0, \"id\": 2, \"name\": \"Label2\"}"]

这是我使用的代码:

class JSONizable(object):
    def to_json(self):
        return json.dumps(self.__dict__)    

class Task(JSONizable):
    def __init__(self):
        self.id = -1
        self.name = "new task"
        self.completed = 1

    def load_sql(self, sql):
        #do things

class Tasks(JSONizable):
    def __init__(self):
        self.tasks=[]

    def load_sql(self,sql):
        #do things

    def to_json(self):
       return json.dumps([x.to_json() for x in self.tasks]) # things go bad here

当此类对象包含项目列表时,您能否建议一种更 Pythonic 的方式来为 python 对象执行 json 序列化?

4

4 回答 4

2

实际上,唯一可行的解​​决方案有点丑陋,恕我直言,unpythonic。

解决方案是扩展JSONEncoder覆盖其default()方法:

import json

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if not isinstance(obj, Task):
            return super(CustomEncoder, self).default(obj)
        return obj.__dict__

json.dumps(list_of_tasks, cls=CustomEncoder)
于 2013-08-07T08:36:30.770 回答
2

结合 njzk2 和怪异的答案,我最终得到了一个可以很好地完成工作的解决方案。

import json
import database

class JSONizable(object):
    def to_json(self):
        return json.dumps(self.to_serializable())
    def to_serializable(self):
        return  self.__dict__

class Task(JSONizable):
    def __init__(self):
        self.id = -1
        self.name = "new task"
        self.completed = 1

    def load_sql(self, sql):
        #...

class Tasks(JSONizable):
    def __init__(self):
        self.tasks=[]

    def load_sql(self,sql):
        #...

    def to_serializable(self):
        return [x.to_serializable() for x in self.tasks]

def get_json_tasks():
    db = database.db
    tasks = Tasks()
    tasks.load_sql(db.get_sql_tasks())
    return tasks.to_json()

它以正确的 Json 格式输出: [{"completed": 0, "id": 1, "name": "labelOne"}, {"completed": 0, "id": 2, "name": "labelTwo"}, {"completed": 0, "id": 3, "name": "LabelThree"}]就像我需要的那样。

于 2013-08-07T09:11:11.747 回答
1

问题是您要序列化两次。一次x.to_json()和第二次创建列表并将其序列化为Tasks.to_json. 我建议您转换为 dicts 而不是 JSON:

class Task(JSONizable):
    def to_serializable(self):
        return {
            # some JSON serializable data here
            "id": self.id,
            "name": self.name,
            "completed": self.completed
        }

class Tasks(JSONizable):
    def to_serializable(self):
        return [x.to_serializable() for x in self.tasks]

然后当你有一个Tasks类的实例时:

TasksInstance = Tasks()
json.dumps(TasksInstance.to_serializable())

顺便说一句: usingself.__dict__可能无论如何都不起作用,因为 的实例JSONizable可能包含不可序列化的属性,例如另一个类的实例。

于 2013-08-07T08:36:10.520 回答
1

您的to_json格式为json. 返回__dict__就足够了:

class JSONizable(object):
    def to_json(self):
        return self.__dict__
于 2013-08-07T08:50:48.890 回答