diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 6dbbf6134a..f086ed43f5 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -51,7 +51,7 @@ from fastapi.logger import logger from fastapi.security.oauth2 import SecurityScopes from fastapi.types import DependencyCacheKey from fastapi.utils import create_model_field, get_path_param_names -from pydantic import BaseModel +from pydantic import BaseModel, Json from pydantic.fields import FieldInfo from starlette.background import BackgroundTasks as StarletteBackgroundTasks from starlette.concurrency import run_in_threadpool @@ -717,16 +717,18 @@ def _validate_value_with_model_field( def _is_json_field(field: ModelField) -> bool: - return any(isinstance(item, Json) for item in field.field_info.metadata) + return any(type(item) is Json for item in field.field_info.metadata) def _get_multidict_value( field: ModelField, values: Mapping[str, Any], alias: Union[str, None] = None ) -> Any: alias = alias or get_validation_alias(field) - if _is_json_field(field): - value = values.get(alias, None) - elif is_sequence_field(field) and isinstance(values, (ImmutableMultiDict, Headers)): + if ( + (not _is_json_field(field)) + and is_sequence_field(field) + and isinstance(values, (ImmutableMultiDict, Headers)) + ): value = values.getlist(alias) else: value = values.get(alias, None)