Ошибка анализа Json с использованием POST в api rest django
я пытаюсь реализовать простой api GET/POST через 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() ),
)
я пытаюсь POST
некоторые json для /api/cuser/
(api-это пространство имен вurls.py
) ,
the JSON
{
"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass"
}
я пробовал как с просматриваемой страницы API, так и httpie
(инструмент python, подобный curl)
httpie command
http --json POST http://localhost:58601/api/cuser/ username=abhishek email=john@doe.com password=secretpass
но я получаю JSON parse ошибка :
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": "john@doe.com", "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)"}
2 ответов
проблема, с которой вы сталкиваетесь, заключается в том, что ваш запрос уже анализируется, и вы пытаетесь проанализировать его во второй раз.
набор допустимых синтаксических анализаторов для представления всегда определяется как список классов. Когда
request.data
доступен, Rest framework рассмотрит заголовок типа контента во входящем запросе и определит, какой парсер использовать для анализа запроса содержание.
в вашем коде вы получаете доступ request.DATA
, который является 2.4.х equaivalent из request.data
. Таким образом, ваш запрос анализируется, как только вы это назовете, и request.DATA
фактически возвращает словарь, который вы ожидали разобрать.
json = request.DATA
это действительно все, что вам нужно для анализа входящих данных JSON. Вы действительно передавали словарь Python в json.loads
, который, похоже, не в состоянии разобрать его, и именно поэтому вы получили свой ошибка.
Я прибыл на этот пост через Google для ""подробно":"JSON parse error - ожидание имени свойства, заключенного в двойные кавычки:". Оказывается, у вас не может быть конечной запятой в JSON, как я привык иметь в словаре Python. Поэтому, если вы получаете эту ошибку, вам может потребоваться изменить сообщение следующим образом:
{
"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass",
}
для этого:
{
"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass"
}
обратите внимание на удаленную запятую после последнего свойства в объекте JSON.