def config_from_json()

in pytext/config/serialize.py [0:0]


def config_from_json(cls, json_obj, ignore_fields=()):
    if getattr(cls, "__EXPANSIBLE__", False):
        component_config = _try_component_config_from_json(cls, json_obj)
        if component_config:
            return component_config
    parsed_dict = {}
    if not hasattr(cls, "_fields"):
        raise IncorrectTypeError(f"{cls} is not a valid config class")
    cls_name = getattr(cls, "__name__", cls)
    # Non-EXPANSIBLE classes can be found in configs
    cls_name_wo_config = cls_name.split(".")[0]
    unknown_fields = (
        set(json_obj)
        - {f[0] for f in cls.__annotations__.items()}
        - {cls_name_wo_config}
    )
    if unknown_fields:
        cls_fields = {f[0] for f in cls.__annotations__.items()}
        raise ConfigParseError(
            f"Unknown fields for class {cls_name} with fields {cls_fields} \
            detected in config json: {unknown_fields}"
        )
    for field, f_cls in cls.__annotations__.items():
        if field in ignore_fields:
            eprint(
                f"Info - field: {field} in class: {cls_name} is skipped in",
                "config_from_json because it's found in the ignore_fields.",
            )
            continue
        value = None
        is_optional = _is_optional(f_cls)

        if field not in json_obj:
            if field in cls._field_defaults:
                # if using default value, no conversion is needed
                value = cls._field_defaults.get(field)
        else:
            try:
                value = _value_from_json(f_cls, json_obj[field])
            except ConfigParseError:
                raise
            except Exception as e:
                raise ConfigParseError(
                    f"failed to parse {field} to {f_cls} with json payload \
                    {json_obj[field]}"
                ) from e
        # validate value
        if value is None and not is_optional:
            raise MissingValueError(
                f"missing value for {field} in class {cls_name} with json {json_obj}"
            )
        parsed_dict[field] = value

    return cls(**parsed_dict)