【问题标题】:Can't decode JSON response from Javascript in Python无法在 Python 中解码来自 Javascript 的 JSON 响应
【发布时间】:2017-04-02 15:48:56
【问题描述】:

我正在尝试使用JQuery.post() 发送一条简单的消息,但它在 Python 上给出了这个错误:

cadastro/editPessoa/ 处的 JSONDecodeError

预期值:第 1 行第 1 列(字符 0)

Javascript(简体):

data = { "pessoa" : [ ["1","joão","321","camarão"] ] }
$.post('editPessoa/', data, function(response) {
    updatePessoas();
  }, 'json');

views.py:

@csrf_exempt    
def editPessoa(request):
    data = json.loads(request.body.decode('utf-8'))
    print(data)
    return HttpResponse('Done!')

尝试 json.loads() 时出现错误,如果我删除 .decode() 错误发生在 print() 上,它会引发无法打印字节

追溯:

JSONDecodeError at /cadastro/editPessoa/
Expecting value: line 1 column 1 (char 0)

Request Method: POST
Request URL: http://localhost:8000/cadastro/editPessoa/
Django Version: 1.10.3
Python Executable: C:\Users\6036794\Documents\django\djangocadastro\py35\Scripts\python.exe
Python Version: 3.5.2
Python Path: ['c:\\Users\\6036794\\Documents\\django\\djangocadastro', 'C:\\Python27', 'C:\\Users\\6036794
\\Documents\\django\\djangocadastro\\py35\\Scripts\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35
\\lib', 'C:\\Python35', 'C:\\Users\\6036794\\Documents\\django\\djangocadastro\\py35', 'C:\\Users\\6036794
\\Documents\\django\\djangocadastro\\py35\\lib\\site-packages']
Server time: Sex, 18 Nov 2016 15:33:35 -0200
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'cadastroapp']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Traceback:  

File "C:\Python35\lib\json\decoder.py" in raw_decode
  355.             obj, end = self.scan_once(s, idx)
  
    
      During handling of the above exception (0), another exception occurred:
    
  

File "C:\Users\6036794\Documents\django\djangocadastro\py35\lib\site-packages\django\core\handlers\exception
.py" in inner
  39.             response = get_response(request)

File "C:\Users\6036794\Documents\django\djangocadastro\py35\lib\site-packages\django\core\handlers\base
.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\6036794\Documents\django\djangocadastro\py35\lib\site-packages\django\core\handlers\base
.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\6036794\Documents\django\djangocadastro\py35\lib\site-packages\django\views\decorators
\csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "c:\Users\6036794\Documents\django\djangocadastro\cadastroapp\views.py" in editPessoa
  19.   data = json.loads(request.body.decode('utf-8'))

File "C:\Python35\lib\json\__init__.py" in loads
  319.         return _default_decoder.decode(s)

File "C:\Python35\lib\json\decoder.py" in decode
  339.         obj, end = self.raw_decode(s, idx=_w(s, 0).end())

File "C:\Python35\lib\json\decoder.py" in raw_decode
  357.             raise JSONDecodeError("Expecting value", s, err.value) from None

Exception Type: JSONDecodeError at /cadastro/editPessoa/
Exception Value: Expecting value: line 1 column 1 (char 0)
Request information:
USER: 6036794

GET: No GET data

POST:
pessoa[0][] = 'Camarão'

FILES: No FILES data

【问题讨论】:

  • 错误发生在print?真的吗?这似乎很奇怪。我本来希望错误出现在json.loads() 函数上。请发布整个错误回溯。
  • @JohnGordon 抱歉,我把情况弄糊涂了,已修复
  • 如果你想让你的jQuery post方法发送json,我认为你必须自己做一些工作才能将它转换成json;它不会因为您使用 'json' 作为最后一个参数而自动执行。
  • @JohnGordon 我也是这么想的,但这不是这里的例子所说的:api.jquery.com/jquery.post
  • @Mojimi 你确定吗?该参数的描述是“服务器预期的数据类型”,即它用于处理服务器的响应您的数据发布之后。

标签: javascript jquery python json django


【解决方案1】:

问题是需要先对数据进行字符串化:

data = { "pessoa" : [ ["1","joão","321","camarão"] ] }
$.post('editPessoa/', JSON.stringify(data), function(response) {
    updatePessoas();
  }, 'json');

我以为是$.post()自动完成的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多