Как получить желаемый вывод JSON с помощью курсора Pymongo со схемой Marshmallow - PullRequest
0 голосов
/ 02 января 2019

У меня проблема с выводом Marshmallow, из-за чего результат JSON:

[
   [
      {
         "data":[
            {
               "x":"2018-04-03 23:28:31.539895",
               "y":15.937
            }
         ],
         "sensor":"/sys/bus/w1/devices/28-0000077aae57/w1_slave"
      },
   ],
   {

   }
]

Но я хочу, чтобы это выглядело так:

[
   {
      "data":[
         {
            "x":"2018-04-03 23:37:40.612334",
            "y":16.187
         }
      ],
      "sensor":"/sys/bus/w1/devices/28-0000077aae57/w1_slave"
   }
]

У меня есть функция get_line, которая возвращает курсор Pymongo:

>>> get_line()
<pymongo.cursor.Cursor object at 0x109162208>

Затем я определяю свои схемы зефира:

from marshmallow import Schema, fields

class PointSchema(Schema):
    x = fields.String()
    y = fields.String()

class LineSchema(Schema):
    sensor = fields.String()
    data = fields.List(fields.Nested(PointSchema))

Я использую следующий код в моей конечной точке колбы, чтобы вернуть данные клиенту:

result = get_line()
output = []
for line in result:
    output.append({'sensor':line['name'], 'data': get_line(line['name'])})

return jsonify(LineSchema(many=True).dump(output))

Я также пытался заменить LineSchema на:

class LineSchema(Schema):
    sensor = fields.String()
    data = fields.Nested(PointSchema, many=True)

, что приводит к точно такому же выводу JSON. Как я должен обрабатывать это для достижения желаемого JSON? Я срываю с этого волосы, но хочу избежать изменения кода клиента, чтобы приспособиться.

1 Ответ

0 голосов
/ 02 января 2019

Хорошо, я понял это ...

Правильная схема зефира для использования была:

class LineSchema(Schema):
     sensor = fields.String()
     data = fields.Nested(PointSchema, many=True)

Однако причина странного результата JSON в форме [ [], {} ] былачто LineSchema(many=True).dump(output) возвращает объект MarshalObject в форме:

MarshalResult(data=[{'data': [{'y': 15.937, 'x': '2018-04-03 23:28:31.539895'}], 'sensor': '/sys/bus/w1/devices/28-0000077aae57/w1_slave'}], errors={})

Таким образом, правильный синтаксис для возврата был:

return jsonify(LineSchema(many=True).dump(output).data)
...