diff --git a/dataclasses_json/cfg.py b/dataclasses_json/cfg.py index 0ad72392..bf1cba28 100644 --- a/dataclasses_json/cfg.py +++ b/dataclasses_json/cfg.py @@ -60,6 +60,7 @@ def config(metadata: dict = None, *, letter_case: Union[Callable[[str], str], LetterCase, None] = None, undefined: Optional[Union[str, Undefined]] = None, field_name: str = None, + field_class_name: bool = False, exclude: Union[Callable[[str, T], bool], Exclude, None] = None, ) -> Dict[str, dict]: if metadata is None: @@ -86,6 +87,9 @@ def override(_, _field_name=field_name): # type:ignore return _field_name letter_case = override + if field_class_name is not None: + lib_metadata['field_class_name'] = field_class_name + if letter_case is not None: lib_metadata['letter_case'] = letter_case diff --git a/dataclasses_json/core.py b/dataclasses_json/core.py index fb7f0e6b..ac235aa2 100644 --- a/dataclasses_json/core.py +++ b/dataclasses_json/core.py @@ -29,7 +29,7 @@ Json = Union[dict, list, str, int, float, bool, None] -confs = ['encoder', 'decoder', 'mm_field', 'letter_case', 'exclude'] +confs = ['encoder', 'decoder', 'mm_field', 'letter_case', 'exclude', 'field_class_name'] FieldOverride = namedtuple('FieldOverride', confs) @@ -83,6 +83,8 @@ def _user_overrides_or_exts(cls): field_config['decoder'] = field_metadata['decoder'] if 'mm_field' in field_metadata: field_config['mm_field'] = field_metadata['mm_field'] + if 'field_class_name' in field_metadata: + field_config['field_class_name'] = field_metadata['field_class_name'] # then apply class-level overrides or extensions field_config.update(cls_config) # last apply field-level overrides or extensions @@ -366,6 +368,8 @@ def _asdict(obj, encode_json=False): getattr(obj, field.name), encode_json=encode_json ) + if overrides[field.name].field_class_name: + field.name = type(getattr(obj, field.name)).__name__ result.append((field.name, value)) result = _handle_undefined_parameters_safe(cls=obj, kvs=dict(result),