【问题标题】:FastApi - receive list of objects in body requestFastApi - 在正文请求中接收对象列表
【发布时间】:2021-10-09 11:50:34
【问题描述】:

我需要创建一个可以接收以下 JSON 并识别其中包含的对象的端点:

{​
  "data": [
    {​
      "start": "A", "end": "B", "distance": 6
    }​,
    {​
      "start": "A", "end": "E", "distance": 4
    }​
  ]
}

我创建了一个模型来处理单个对象:

class GraphBase(BaseModel):
    start: str
    end: str
    distance: int

有了它,我可以将它保存在数据库中。但现在我需要接收一个对象列表并将它们全部保存。 我试图做这样的事情:

class GraphList(BaseModel):
    data: Dict[str, List[GraphBase]]

@app.post("/dummypath")
async def get_body(data: schemas.GraphList):
    return data

但我在 FastApi 上不断收到此错误:Error getting request body: Expecting property name enclosed in double quotes: line 1 column 2 (char 1),并在响应中显示此消息:

{
    "detail": "There was an error parsing the body"
}

我是 python 的新手,甚至是 FastApi 的新手,如何将该 JSON 转换为 GraphBase 列表以将它们保存在我的数据库中?

【问题讨论】:

  • data: List[GraphBase]GraphList 的定义中呢? data 字段是图形库对象的列表。
  • @KotaMori 我尝试了你的建议,它返回了同样的错误。
  • 您尝试过文档页面上的 API 吗?
  • @KotaMori 我尝试了所有可以在 API 文档页面上找到的方法,但没有成功。

标签: python json fastapi pydantic


【解决方案1】:

这是一个工作示例。

from typing import List
from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()

class GraphBase(BaseModel):
    start: str
    end: str
    distance: int

class GraphList(BaseModel):
    data: List[GraphBase]

@app.post("/dummypath")
async def get_body(data: GraphList):
    return data

我可以在自动生成的文档上尝试这个 API。

或者,在控制台上(您可能需要根据您的设置调整 URL):

curl -X 'POST' \
  'http://localhost:8000/dummypath' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "data": [
    {
      "start": "string",
      "end": "string",
      "distance": 0
    }
  ]
}'

错误看起来像数据问题。我发现你在几个地方有额外的空间。请尝试以下操作:

{
  "data": [
    {
      "start": "A", "end": "B", "distance": 6
    },
    {
      "start": "A", "end": "E", "distance": 4
    }
  ]
}

多余空格的位置(我删除了)如下:

【讨论】:

  • 非常感谢!!我花了很多时间在数据中的代码中寻找问题!它适用于您的格式化数据。你用什么来定位那些额外的空格?你知道 FastApi 是否有办法处理这类问题吗?
  • 我使用了jsoneditoronline.org。那里的原始数据无效。 FastAPI 不会帮助您,因为数据不是有效的 JSON 对象。它所能做的最好的就是告诉你解析数据失败,这实际上是在错误消息中。
  • 是的,我意识到数据可能有问题,但无法弄清楚它是什么。我使用的所有编辑器都无法显示这些额外的空格,并且错误消息不清楚问题是什么。再次感谢您的解释以及您使用的 json 验证器的链接!!!
猜你喜欢
  • 2020-09-27
  • 2021-03-14
  • 2021-09-01
  • 2021-06-19
  • 2017-08-21
  • 2021-12-21
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多