Json parse error using POST in django rest api
Solution 1
The problem that you are running into is that your request is already being parsed, and you are trying to parse it a second time.
From "How the parser is determined"
The set of valid parsers for a view is always defined as a list of classes. When
request.data
is accessed, REST framework will examine the Content-Type header on the incoming request, and determine which parser to use to parse the request content.
In your code you are accessing request.DATA
, which is the 2.4.x equaivalent of request.data
. So your request is being parsed as soon as you call that, and request.DATA
is actually returning the dictionary that you were expecting to parse.
json = request.DATA
is really all you need to parse the incoming JSON data. You were really passing a Python dictionary into json.loads
, which does not appear to be able to parse it, and that is why you were getting your error.
Solution 2
I arrived at this post via Google for
"detail": "JSON parse error - Expecting property name enclosed in double-quotes": Turns out you CANNOT have a trailing comma in JSON.
So if you are getting this error you may need to change a post like this:
{
"username" : "abhishek",
"email" : "[email protected]",
"password" : "secretpass",
}
to this:
{
"username" : "abhishek",
"email" : "[email protected]",
"password" : "secretpass"
}
Note the removed comma after the last property in the JSON object.
user001
Updated on July 09, 2022Comments
-
user001 almost 2 years
I am trying to implement a simple GET/POST api via Django REST framework
views.py
class cuser(APIView): def post(self, request): stream = BytesIO(request.DATA) json = JSONParser().parse(stream) return Response()
urls.py
from django.conf.urls import patterns, url from app import views urlpatterns = patterns('', url(r'^challenges/',views.getall.as_view() ), url(r'^cuser/' , views.cuser.as_view() ), )
I am trying to
POST
some json to/api/cuser/
(api is namespace in my project'surls.py
) , theJSON
{ "username" : "abhishek", "email" : "[email protected]", "password" : "secretpass" }
I tried from both Browseable API page and
httpie
( A python made tool similar to curl)httpie command
http --json POST http://localhost:58601/api/cuser/ username=abhishek [email protected] password=secretpass
but I am getting JSON parse error :
JSON parse error - Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Whole Debug message using --verbose --debug
POST /api/cuser/ HTTP/1.1 Content-Length: 75 Accept-Encoding: gzip, deflate Host: localhost:55392 Accept: application/json User-Agent: HTTPie/0.8.0 Connection: keep-alive Content-Type: application/json; charset=utf-8 {"username": "abhishek", "email": "[email protected]", "password": "aaezaakmi1"} HTTP/1.0 400 BAD REQUEST Date: Sat, 24 Jan 2015 09:40:03 GMT Server: WSGIServer/0.1 Python/2.7.9 Vary: Accept, Cookie Content-Type: application/json Allow: POST, OPTIONS {"detail":"JSON parse error - Expecting property name enclosed in double quotes: line 1 column 2 (char 1)"}