diff --git a/airflow/serialization/serialized_objects.py b/airflow/serialization/serialized_objects.py index d41d70a4e7527..6cb33cd203277 100644 --- a/airflow/serialization/serialized_objects.py +++ b/airflow/serialization/serialized_objects.py @@ -560,14 +560,19 @@ def _deserialize_param(cls, param_dict: dict): class_: type[Param] = import_string(class_name) attrs = ("default", "description", "schema") kwargs = {} + + def is_serialized(val): + if isinstance(val, dict): + return Encoding.TYPE in val + if isinstance(val, list): + return all(isinstance(item, dict) and Encoding.TYPE in item for item in val) + return False + for attr in attrs: if attr not in param_dict: continue val = param_dict[attr] - is_serialized = (isinstance(val, dict) and Encoding.TYPE in val) or ( - isinstance(val, list) and all(Encoding.TYPE in param for param in val) - ) - if is_serialized: + if is_serialized(val): deserialized_val = cls.deserialize(param_dict[attr]) kwargs[attr] = deserialized_val else: diff --git a/tests/serialization/test_dag_serialization.py b/tests/serialization/test_dag_serialization.py index 994ba12b3224d..44411f5c075e8 100644 --- a/tests/serialization/test_dag_serialization.py +++ b/tests/serialization/test_dag_serialization.py @@ -836,6 +836,7 @@ def __init__(self, path: str): Param("my value", description="hello", schema={"type": "string"}), Param("my value", description="hello"), Param(None, description=None), + Param([True], type="array", items={"type": "boolean"}), ], ) def test_full_param_roundtrip(self, param):