【问题标题】:Flask JSON decode error: simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)烧瓶 JSON 解码错误:simplejson.errors.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
【发布时间】:2020-02-26 19:17:47
【问题描述】:

我目前正在开发一个网络服务器,在测试输出 JSON 时会抛出此错误:

simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)  

这是网络服务器的代码:

    from flask import Flask, request
    import json
    app = Flask(__name__)

    tasks=[]
    #Create a new task
    @app.route('/v1/tasks', methods=['POST'])
    def post():
        data=request.get_json()
        title=data["title"]
        tasks.append(json.dumps({"id": len(tasks)+1, "title": title, "is_completed": "false"}))
        #tasks[len(tasks)+1]={"title": title, "is_completed": "false"}
        index=len(tasks)
        return json.dumps({"id": index}), 201

这是我使用的测试:

    import requests
    import json

    response = requests.post('http://localhost:5000/v1/tasks', json={'title': "Test Task 2"})
    print(response.json())
    print(response.status_code)

这是完整的错误回溯:

  {'id': 5}
    201
      Traceback (most recent call last):
      File "project1-test2.py", line 42, in <module>
        print(response.json())
      File "/home/alexanderfarr/.local/lib/python3.6/site-packages/requests/models.py", line 898, in json
        return complexjson.loads(self.text, **kwargs)
      File "/usr/lib/python3/dist-packages/simplejson/__init__.py", line 518, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/python3/dist-packages/simplejson/decoder.py", line 370, in decode
        obj, end = self.raw_decode(s)
      File "/usr/lib/python3/dist-packages/simplejson/decoder.py", line 400, in raw_decode
        return self.scan_once(s, idx=_w(s, idx).end())
    simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)   

感谢您的帮助!

编辑:在测试我的 get 函数时,我注意到这甚至没有达到:

#List all tasks created
@app.route('/v1/tasks', methods=['GET'])
def getall():
   return json.dumps({"tasks": tasks})

#Get a specific task
@app.route('/v1/tasks/{id}', methods=['GET'])
def getone(id):
    print("in get")
    if id in tasks:
        print(tasks[id])
        return json.dumps(tasks[id]), 200
    else:
        return json.dumps({error: "There is no task at that id"}), 404

我的测试代码:

import requests
import json
response=requests.get('http://localhost:5000/v1/tasks/{1}')
print(response.json())
print(response.status_code)

在控制台日志中,甚至没有显示打印语句:

Traceback (most recent call last):
  File "project1-test2.py", line 6, in <module>
    print(response.json())
  File "/home/alexanderfarr/.local/lib/python3.6/site-packages/requests/models.py", line 898, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3/dist-packages/simplejson/__init__.py", line 518, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3/dist-packages/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/usr/lib/python3/dist-packages/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 

【问题讨论】:

  • JSON 是否被正确接收,一切正常?
  • {'id': 5} 收到,应该是正确的
  • 但是我怎样才能摆脱这个错误呢?

标签: python json python-3.x flask


【解决方案1】:

如果 Flask 路由返回的字符串也安排了 application/json 的 mimetype,则接收端可能不会认为它正在获取 JSON。假设你使用的是最近的 Flask,从路由返回一个字典会得到一个免费的jsonify,它会自动将响应的 mimetype 设置为application/json

试试

return {"id": index}, 201

【讨论】:

  • 好的,谢谢,你能看看我的编辑并帮助我解释为什么甚至没有达到打印语句吗?
  • 路由中的打印语句?尝试将它们替换为 app.logger.info()
  • @Python-Data-Science-Learner 这完全是一个不同的问题,不是吗?
  • @DaveW.Smith,是的,路线中的打印语句。现在,我看到以下内容: {"tasks": ["{\"is_completed\": \"false\", \"id\": 1, \"title\": \"Test Task 2\"}", "{\"is_completed\": \"false\", \"id\": 2, \"title\": \"Test Task 2\"}"]} 为什么到处都是\",如何避免那个?
  • 由于将json.dumps() 附加到tasks,您将获得双重编码。改为附加原始字典。
猜你喜欢
  • 2021-02-10
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2021-09-20
  • 2019-09-10
  • 2020-04-18
相关资源
最近更新 更多