code: def json_decode(data_type, serialized_obj, caller_permissions=None,
                  alias_validators=None, strict=True, old_style=False):
      
      try:
          deserialized_obj = json.loads(serialized_obj)
      except ValueError:
          raise bv.ValidationError('could not decode input as JSON')
      else:
          return json_compat_obj_decode(
              data_type, deserialized_obj, caller_permissions=caller_permissions,
              alias_validators=alias_validators, strict=strict, old_style=old_style)
docs: Performs the reverse operation of json_encode.
  
      Args:
          data_type (Validator): Validator for serialized_obj.
          serialized_obj (str): The JSON string to deserialize.
          caller_permissions (list): The list of raw-string caller permissions
              with which to serialize.
          alias_validators (Optional[Mapping[bv.Validator, Callable[[], None]]]):
              Custom validation functions. These must raise bv.ValidationError on
              failure.
          strict (bool): If strict, then unknown struct fields will raise an
              error, and unknown union variants will raise an error even if a
              catch all field is specified. strict should only be used by a
              recipient of serialized JSON if it's guaranteed that its Stone
              specs are at least as recent as the senders it receives messages
              from.
  
      Returns:
          The returned object depends on the input data_type.
              - Boolean -> bool
              - Bytes -> bytes
              - Float -> float
              - Integer -> long
              - List -> list
              - Map -> dict
              - Nullable -> None or its wrapped type.
              - String -> unicode (PY2) or str (PY3)
              - Struct -> An instance of its definition attribute.
              - Timestamp -> datetime.datetime
              - Union -> An instance of its definition attribute.