docs: def json_to_params(fn=None, return_json=True):
      """
      Convert JSON in the body of the request to the parameters for the wrapped
      function.
  
      If the JSON is list, add it to ``*args``.
  
      If dict, add it to ``**kwargs`` in non-rewrite mode (no key in ``**kwargs``
      will be overwritten).
  
      If single value, add it to ``*args``.
  
      Args:
          return_json (bool, default True): Should the decorator automatically
                      convert returned value to JSON?
      """
      def json_to_params_decorator(fn):
          @handle_type_error
          @wraps(fn)
          def json_to_params_wrapper(*args, **kwargs):
              data = decode_json_body()
  
              if type(data) in [tuple, list]:
                  args = list(args) + data
              elif type(data) == dict:
                  # transport only items that are not already in kwargs
                  allowed_keys = set(data.keys()) - set(kwargs.keys())
                  for key in allowed_keys:
                      kwargs[key] = data[key]
              elif type(data) in PRIMITIVE_TYPES:
                  args = list(args)
                  args.append(data)
  
              if not return_json:
                  return fn(*args, **kwargs)
  
              return encode_json_body(
                  fn(*args, **kwargs)
              )
  
          return json_to_params_wrapper
  
      if fn:  # python decorator with optional parameters bukkake
          return json_to_params_decorator(fn)
  
      return json_to_params_decorator