Ошибка анализа 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.