猿问

如何使用 SQLAlchemy 和 FastAPI 中的 json.dumps 删除 json

好的,所以我的课程设置如下:


class ToDictMixin(object):

    def to_dict(self, camelcase=True):

        if camelcase:

            return {to_camelcase(column.key): getattr(self, attr) for attr, column in self.__mapper__.c.items()}

        else:

            return {column.key: getattr(self, attr) for attr, column in self.__mapper__.c.items()}



class Company(Base, ToDictMixin):

    __tablename__ = 'companies'


    number = Column(Integer, primary_key=True)

    name = Column(String)

    incorporated = Column(Date)

我也有这些功能:


def to_camelcase(s):

    return re.sub(r'(?!^)_([a-zA-Z])', lambda m: m.group(1).upper(), s)



def alchemyencoder(obj):

    """

    JSON encoder function for SQLAlchemy special classes.

    """


    if isinstance(obj, datetime.date):

        return obj.isoformat()

    elif isinstance(obj, decimal.Decimal):

        return float(obj)



def to_json(self, rel=None):

    return json.dumps(self.to_dict(), default=alchemyencoder)

在我的 FastAPI 文件中,我执行以下操作:


@app.get("/testrequest")

def test_request():

    query = SESSION.query(Company).order_by(Company.number).filter_by(name="PAARTI LTD")

    return {"company": to_json(i) for i in query}

在加载此页面之前,我在 python 控制台中测试了以下内容:


>>> query = SESSION.query(Company).order_by(Company.number).filter_by(name="PAARTI LTD")

>>> a = query[0]

>>> a.to_dict()

{'created': datetime.datetime(2020, 5, 7, 13, 10, 5), 'number': 12585493, 'name': 'PAARTI LTD', 'incorporated': datetime.date(2020, 5, 5)}

>>> to_json(a)

'{"created": "2020-05-07T13:10:05", "number": 12585493, "name": "PAARTI LTD", "incorporated": "2020-05-05"}'

这对我来说是正确的。这正是我希望它显示的方式。


但是,在我的浏览器中测试http://127.0.0.1:8000/testrequest时,我得到以下信息:


{"company":"{\"created\": \"2020-05-07T13:10:05\", \"number\": 12585493, \"name\": \"PAARTI LTD\", \"incorporated\": \"2020-05-05\"}"}


我不明白为什么它试图在网络响应中逃避这些反斜杠。我怎样才能解决这个问题,以获得以下正确的 json 响应:


{"company":{"created": "2020-05-07T13:10:05", "number": 12585493, "name": "PAARTI LTD", "incorporated": "2020-05-05"}}



白衣染霜花
浏览 145回答 3
3回答

尚方宝剑之说

import json@app.get("/testrequest")def test_request():    query = SESSION.query(Company).order_by(Company.number).filter_by(name="PAARTI LTD")    return {"company": json.loads(to_json(i) for i in query)}只需使用 json.loads(str)

慕婉清6462132

您可以像这样返回 JSON:        @router.get('/statistics')        async def get_statistics():            return self.json_data对我来说,它就像一个魅力{    "CLIENT": [        {            "topics": [                "topic"            ],        }    ]}

繁华开满天机

试试这个,先构建字典,然后立即转储到 json。@app.get("/testrequest") def test_request():    query = SESSION.query(Company).order_by(Company.number).filter_by(name="PAARTI LTD")    return json.dumps({"company": i.to_dict() for i in query}, default=alchemyencoder)
随时随地看视频慕课网APP

相关分类

Python
我要回答