python зефир: какой обходной путь для проверки вложенного запроса JSON? - PullRequest
0 голосов
/ 07 мая 2020

Я хочу проверить вложенный запрос JSON с помощью marshmallow, я в значительной степени следил за его документацией, чтобы проверить данные моего запроса JSON. После нескольких попыток я думаю, что использование зефира для проверки сложных данных JSON - правильный путь. Однако я получил ошибку проверки от зефира следующим образом:

обновленное сообщение об ошибке

> PS C:\Users\jyson\immunomatch_api> python .\json_validation.py
> Traceback (most recent call last):   File ".\json_validation.py", line
> 58, in <module>
>     app = schema.load(app_data)   File "C:\Users\jyson\AppData\Local\Programs\Python\Python37\lib\site-packages\marshmallow\schema.py",
> line 723, in load  
>     data, many=many, partial=partial, unknown=unknown, postprocess=True   File
> "C:\Users\jyson\AppData\Local\Programs\Python\Python37\lib\site-packages\marshmallow\schema.py",
> line 904, in _do_load
>     raise exc marshmallow.exceptions.ValidationError: {'_schema': ['Invalid input type.']}

обновление

раньше Я получил ошибку позиционного аргумента, потому что я неявно определяю такие функции, как def __init__(self, age, gender, features), вместо того, чтобы выполнять жесткий код в def init (self, возраст, пол, IL10, CRP). почему у меня выше ошибка? какая-нибудь быстрая мысль? спасибо

моя попытка json проверки с зефиром :

from marshmallow import Schema, fields, post_load
from marshmallow import EXCLUDE
import json

class Feature(object):
    def __init__(self, value, device):
        self.value = value
        self.device= device

class FeatureSchema(Schema):
    value = fields.Str()
    device= fields.Str()

    @post_load
    def make_feature(self, data, **kwargs):
        return Feature(**data)

class App(object):
    def __init__(self, age, gender, features):
        self.age = age
        self.gender = gender
        self.features = features

class AppSchema(Schema):
    age = fields.Str()
    gender = fields.Str()
    features = fields.Nested(FeatureSchema)

    @post_load
    def make_app(self, data, **kwargs):
        return App(**data)

json_data = """{

"body": {
    "gender": "M",
    "PCT4": {
      "value": 12,
      "device": "roche_cobas"
    },
    "IL10": {
      "value": 12,
      "device": "roche_cobas"
    },
    "CRP": {
      "value": 12,
      "device": "roche_cobas"
    },
     "OM10": {
      "value": 120,
      "device": "roche_bathes"
    }
  }
}"""

app_data = json.loads(json_data)

schema = AppSchema(unknown=EXCLUDE, many=TRUE)
app = schema.load(app_data)

print(app.data.features.value)

почему у меня указанная выше ошибка? как правильно проверить вложенный JSON? почему у меня ошибка неизвестного поля? любая возможная мысль избавиться от ошибки выше? спасибо

1 Ответ

1 голос
/ 07 мая 2020

В ошибке явно упоминается проблема

marshmallow.exceptions.ValidationError: {'OM10': ['Unknown field.'], 'CRP': ['Unknown field.'], 'IL10': ['Unknown field.'], 'PCT4': ['Unknown field.']}

Схема Marshmallow не понимает поле, так как вы не объявили его в своей схеме, и по умолчанию Marshmallow выдаст ошибку, если обнаружит Unknown Field

Простое исправление: EXCLUDE они смотрят на ваш код, кажется, он вам все равно не нужен.

Я бы посоветовал передать аргумент unknown как EXCLUDE при его создании.

from marshmallow import EXCLUDE
schema = AppSchema(unknown=EXCLUDE)

Более подробную информацию можно найти здесь - https://marshmallow.readthedocs.io/en/stable/quickstart.html#handling -unknown-fields

...