How to create a post using REST API with sending data as a JSON body?

That’s strange, but nonetheless, you should know that whether you use cURL, PHP, JS, etc., if you’re sending a JSON data, then you should set the Content-Type header to application/json.

And via the cURL command line, you can use the -H option:

curl --user "username:password" -X POST \
-H "Content-Type: application/json" \
-i https://example.com/wp-json/wp/v2/posts \
-d '{"title": "foo bar", "content": "test"}'

Also, if you’re using Windows, you may need to use the double quotes instead of single quotes with the -d option. So the above would be: ( note I used the caret (^) symbol and not backslash )

curl --user "username:password" -X POST ^
-H "Content-Type: application/json" ^
-i https://example.com/wp-json/wp/v2/posts ^
-d "{\"title\": \"Windows test\", \"content\": \"test\"}"