Problem with data and json parameters in requests.post()

<!-- Summary. -->

## Expected Result
`data` parameter should be able to take in a `dict` and convert it into a json format string automatically in the request, and `json` parameter should be able to take in a json string. According to the comments on the code, 

> :param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.

<!-- What you expected. -->

## Actual Result
When I input a dict to `data` parameter, it doesn't convert it into a json format string, it only works if I give it a json format string. And for `json` parameter, it doesn't work if I input a json format string, but works with a `dict` input.
<!-- What happened instead. -->

## Reproduction Steps

```python
import requests
import json

url = 'https://simple-books-api.glitch.me/api-clients'
payload = {
  "bookId": 2,
  "customerName": "John Smith"
}
r = requests.post(url, data=payload)
print(r.request.body) # this will print something like bookId=2&customerName=John+Smith
r = requests.post(url, data=json.dumps(payload))
print(r.request.body) # this will print a normal json format string
```

## System Information

    $ python -m requests.help

```json
{
  "chardet": {
    "version": null
  },
  "charset_normalizer": {
    "version": "2.1.1"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "3.4"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.10.7"
  },
  "platform": {
    "release": "21.6.0",
    "system": "Darwin"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.28.1"
  },
  "system_ssl": {
    "version": "1010111f"
  },
  "urllib3": {
    "version": "1.26.12"
  },
  "using_charset_normalizer": true,
  "using_pyopenssl": false
}
```

<!-- This command is only available on Requests v2.16.4 and greater. Otherwise,
please provide some basic information about your system (Python version,
operating system, &c). -->


Hi @zhu-yifang, it seems like there's assumptions being made that are not present in the doc strings you referenced.

Data is form-encoded as specified in the [getting started](https://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests) docs. It is not json, hence the json parameters existence which is also explained in this section.

The json parameter is defined as "A JSON serializable Python object to send in the body of the Request." on the [top-level request](https://docs.python-requests.org/en/latest/api/#requests.request) API. Nowhere does it state this data is a string.

But it says 

> To do this, simply pass a dictionary to the data argument. Your dictionary of data will automatically be form-encoded when the request is made:

Look at requests/api.py, line 107 - 109, it says

>     :param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`.
>     :param json: (optional) json data to send in the body of the :class:`Request`.

I think you guys need to change the description here so it makes less confusion


Hey, my issue hasn't been solved yet. Don't close it, please.