docs: def from_json_dict(cls,
                         json_dict  # type: Dict[str, Any]
                         ):
          # type: (...) -> StringSpec
          """ Make a StringSpec object from a dictionary containing its
              properties.
  
              :param dict json_dict: This dictionary must contain an
                  `'encoding'` key associated with a Python-conformant
                  encoding. It must also contain a `'hashing'` key, whose
                  contents are passed to :class:`FieldHashingProperties`.
                  Permitted keys also include `'pattern'`, `'case'`,
                  `'minLength'`, and `'maxLength'`.
              :raises InvalidSchemaError: When a regular expression is
                  provided but is not a valid pattern.
          """
          # noinspection PyCompatibility
          result = cast(StringSpec,  # Go away, Mypy.
                        super().from_json_dict(json_dict))
  
          format_ = json_dict['format']
          if 'encoding' in format_ and result.hashing_properties:
              result.hashing_properties.encoding = format_['encoding']
  
          if 'pattern' in format_:
              pattern = format_['pattern']
              try:
                  result.regex = re_compile_full(pattern)
              except (SyntaxError, re.error) as e:
                  msg = "Invalid regular expression '{}.'".format(pattern)
                  e_new = InvalidSchemaError(msg)
                  raise_from(e_new, e)
              result.regex_based = True
  
          else:
              result.case = format_.get('case', StringSpec._DEFAULT_CASE)
              result.min_length = format_.get('minLength')
              result.max_length = format_.get('maxLength')
              result.regex_based = False
  
          return result