code: def dict_to_serializable_repr(x):
      
      # list of JSON representations of hashable objects which were
      # used as keys in this dictionary
      serialized_key_list = []
      serialized_keys_to_names = {}
      # use the class of x rather just dict since we might want to convert
      # derived classes such as OrderedDict
      result = type(x)()
      for (k, v) in x.items():
          if not isinstance(k, string_types):
              # JSON does not support using complex types such as tuples
              # or user-defined objects with implementations of __hash__ as
              # keys in a dictionary so we must keep the serialized
              # representations of such values in a list and refer to indices
              # in that list
              serialized_key_repr = to_json(k)
              if serialized_key_repr in serialized_keys_to_names:
                  k = serialized_keys_to_names[serialized_key_repr]
              else:
                  k = index_to_serialized_key_name(len(serialized_key_list))
                  serialized_keys_to_names[serialized_key_repr] = k
                  serialized_key_list.append(serialized_key_repr)
          result[k] = to_serializable_repr(v)
      if len(serialized_key_list) > 0:
          # only include this list of serialized keys if we had any non-string
          # keys
          result[SERIALIZED_DICTIONARY_KEYS_FIELD] = serialized_key_list
      return result
docs: Recursively convert values of dictionary to serializable representations.
      Convert non-string keys to JSON representations and replace them in the
      dictionary with indices of unique JSON strings (e.g. __1, __2, etc..).