json FastApi -接收主体请求中的对象列表

xzv2uavs  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(207)

我需要创建一个端点,它可以接收以下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列表并将其保存在我的数据库中?

l5tcr1uw

l5tcr1uw1#

这是一个工作示例。

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
    }
  ]
}


额外空间的位置(我删除了)如下:


oiopk7p5

oiopk7p52#

通常,FastAPI允许简单地接收对象列表,不需要将该列表 Package 在额外的对象中。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class ObjectListItem(BaseModel):
  ...

@app.post("/api_route")
def receive_list_of_objects(objects_list: list[ObjectListItem]):
  ...

字符串
更多信息请参见FastAPI文档。

相关问题