Добавлены экранированные кавычки в JSON в приложении Flask с mongoDB - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь создать API для своего проекта Flask.У меня есть данные, хранящиеся в mongoDB, и для построения API я использую flask_restful.Проблема в том, что в JSON добавлены экранированные кавычки, и я не могу понять, почему, и у меня есть JSON без них.

Вот так выглядит моя функция get:

from flask_restful import Resource
import json
from bson import json_util

class Harvests(Resource):

    def get(self):
        json_docs = []

        for doc in db.collection.find():
            json_doc = json.dumps(doc, default=json_util.default)
            json_docs.append(json_doc)

        return json_docs

В приложении.py это просто так

api = Api(app)
api.add_resource(Harvests, '/api/harvests')

И я получаю JSON с экранированными кавычками (в браузере или с помощью curl)

[
"{\"_id\": {\"$oid\": \"5c05429cc4247917d66163a7\"},...
]

Если я попробую это вне Flask (выведите JSON из mongo) и все работает просто отлично.Я пытался использовать .replace (), но я думаю, что это не самое элегантное решение, но оно все равно не сработало.Есть идеи, как мне избавиться от этих наклонных черт?

1 Ответ

0 голосов
/ 15 февраля 2019

То, что вы видите, абсолютно то, что вы должны ожидать увидеть в соответствии с вашим кодом, поэтому я думаю, что в какой-то момент возникло недоразумение.Позвольте мне объяснить, что вы делаете.

Вы конвертируете каждый документ (структуру данных) в jsonified версию (строку) этих данных.Затем вы собираете эти строки в список.Позже вы увидите этот список, и, конечно, вы увидите список строк.Каждая из этих строк содержит jsonified версию структуры данных (словарь с открывающими фигурными скобками, ключами и значениями внутри, и каждый ключ представляет собой саму строку с кавычками, поэтому эти кавычки экранируются внутри jsonified строки).

Я рекомендую собрать ваши документы в list и затем преобразовать это list в json:

def get(self):
    docs = []

    for doc in db.collection.find():
        docs.append(doc)

    return json.dumps(docs, default=json_util.default)

Таким образом, вы получите одну строку json, представляющую список документов.

Возможно, ваш фреймворк уже применяет jsonifying автоматически, в этом случае просто не выполняйте этот шаг самостоятельно:

    return docs

Просто используйте это вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...