Как я могу удалить дополнительные обратные косые черты в выводе json, используя json .dumps в SQLAlchemy & FastAPI? - PullRequest
0 голосов
/ 07 мая 2020

Хорошо, мои классы настроены следующим образом:

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

1 Ответ

0 голосов
/ 07 мая 2020

Попробуйте это, сначала создайте словарь, а затем сразу сделайте дамп в 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)

...