Json在django rest api中使用POST解析错误

时间:2015-01-23 16:38:32

标签: json django rest django-rest-framework

我正在尝试通过Django REST框架实现一个简单的GET / POST api

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中的命名空间), JSON

{
"username" : "abhishek",
"email" : "john@doe.com",
"password" : "secretpass"
}

我尝试了可浏览的API页面和httpie(一个类似于curl的python制作工具)

httpie command

http --json POST http://localhost:58601/api/cuser/ username=abhishek email=john@doe.com password=secretpass

但我收到JSON解析错误:

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)"}

3 个答案:

答案 0 :(得分:8)

您遇到的问题是您的请求已被解析,并且您正在尝试再次解析它。

来自"How the parser is determined"

  

视图的有效解析器集始终定义为类列表。访问request.data时,REST框架将检查传入请求的Content-Type标头,并确定用于解析请求内容的解析器。

在您的代码中,您正在访问request.DATA,即request.data的2.4.x等效值。因此,只要您调用它,您的请求就会被解析,而request.DATA实际上正在返回您希望解析的字典。

json = request.DATA

实际上只需要解析传入的JSON数据。你真的把Python字典传递给json.loads,它似乎无法解析它,这就是你收到错误的原因。

答案 1 :(得分:3)

我是通过谷歌来到这个帖子的" "详细信息":" JSON解析错误 - 期望用双引号括起来的属性名称:"。原来你不能在JSON中有一个尾随逗号,因为我习惯于在Python字典中使用。因此,如果您收到此错误,则可能需要更改此类帖子:

{
    "username" : "abhishek",
    "email" : "john@doe.com",
    "password" : "secretpass",
}

到此:

{
    "username" : "abhishek",
    "email" : "john@doe.com",
    "password" : "secretpass"
}

请注意JSON对象中最后一个属性之后删除的逗号。

答案 2 :(得分:0)

基本上,每当您尝试使用请求库发出发布请求时,该库还包含json参数,当data参数设置为文件或数据时,该参数将被忽略。因此基本上,当 json 参数设置为json数据时。标头设置为Content-Type: application/json Json 参数基本上编码数据,将其发送为 json 格式。这样一来,在DRF,尤其能够解析json 数据。否则,如果仅使用数据参数,则将其视为形式编码

requests.post(url, json={"key1":"value1"})

您可以在这里request.post complicated post methods

找到更多信息