【问题标题】:How can I remove additional backslashes in json output using json.dumps in SQLAlchemy & FastAPI?如何使用 SQLAlchemy 和 FastAPI 中的 json.dumps 删除 json 输出中的额外反斜杠?
【发布时间】:2020-08-22 19:19:57
【问题描述】:

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

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"}}

【问题讨论】:

  • 从请求处理程序返回时不需要to_json,因为返回的dict会自动进行json-ified
  • 谢谢。这可行,但我现在无法将我的类属性更改为 camelCase,因此我尝试解决方法。我想我可能需要多看一下文档。
  • 不幸的是,我认为 jsonify 只是 Flask。但是我发现了一个看起来可以解决我的驼峰问题的帖子:medium.com/analytics-vidhya/…

标签: python json flask sqlalchemy fastapi


【解决方案1】:

试试这个,先建字典,然后一次性转储到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)

【讨论】:

  • 不幸的是,这使情况变得更糟。我想我可以看到问题所在 - 我正在对其进行序列化,而 return 语句正在尝试再次对其进行序列化。我正在研究其他响应方法。
【解决方案2】:
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)

【讨论】:

    【解决方案3】:

    你可以像这样返回 JSON:

            @router.get('/statistics')
            async def get_statistics():
                return self.json_data
    

    对我来说,它就像一个魅力

    {
        "CLIENT": [
            {
                "topics": [
                    "topic"
                ],
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多