【问题标题】:Json parse error using POST in django rest api在 django rest api 中使用 POST 解析 Json 错误
【发布时间】:2015-03-22 18:20:29
【问题描述】:

我正在尝试通过 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"
}

我从 Browseable 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)"}

【问题讨论】:

  • 准确地显示您是如何发布该 JSON 的。从哪里来?
  • @DanielRoseman 尝试了httpie 和可浏览的 api 页面
  • 尝试在 HTTPie 命令中添加--verbose --debug。这将向您显示正在发送的请求以及一些额外的调试输出。
  • @JakubRoztočil 添加了调试输出,虽然我无法从中获得太多收益
  • 我认为服务器端存在一些错误。请求/JSON 看起来是正确的。您也可以尝试向httpbin.org 发送相同的请求,看看它是如何被解释的:$ http --json httpbin.org/post username=abhishek email=john@doe.com password=secretpass

标签: json django rest django-rest-framework


【解决方案1】:

我是通过 Google 获得这篇文章的

"detail": "JSON 解析错误 - 期望属性名称用双引号括起来": 原来你不能在 JSON 中有 尾随逗号

因此,如果您遇到此错误,您可能需要像这样更改帖子:

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

到这里:

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

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

【讨论】:

    【解决方案2】:

    基本上,每当您尝试使用 requests 库发出发布请求时,该库还包含 json 参数,当数据参数设置为文件或数据时,该参数将被忽略。所以基本上当 json 参数设置为 json 数据时。标头设置为Content-Type: application/jsonJson 参数基本上编码数据 发送成 json 格式。因此在 DRF 尤其能够解析 json 数据。否则在只有数据参数的情况下,它被视为表单编码

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

    你可以在这里找到更多request.post complicated post methods

    【讨论】:

      【解决方案3】:

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

      来自"How the parser is determined"

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

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

      json = request.DATA
      

      确实是解析传入的 JSON 数据所需的一切。您确实将 Python 字典传递给 json.loads,它似乎无法解析它,这就是您收到错误的原因。

      【讨论】:

      • 发回时数据是否也自动渲染为json?
      • 如果你使用自定义响应类,是的。
      猜你喜欢
      • 2018-10-16
      • 2021-11-15
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多