Pydantic:如何解析非字典对象
Pydantic: how to parse non dict objects
输入以下数据
data = {
'campaigns': [
{
'title': 'GBP',
'geo_segment': 'WW',
'ac_type': 'Value',
'conversion': 'soft',
'asset_type': 'ALL',
'date': '22.04.21',
'name': 'GBP_WW_1_core_22.04.21',
'budget': '2000',
'cpa': '1,00'
}
],
'stages': [
'pre',
'post'
],
'language_mode': 'all_en'
}
为了解析campaigns
,我使用parse_obj()
方法
campaigns = parse_obj_as(List[CampaignData], data['campaigns'])
class CampaignData(BaseModel):
title: NonEmptyString
geo_segment: NonEmptyString
......
有效。
如何验证其余数据(stages
:List
,language_mode
:str
),这不是 dict
类型?
class GoogleCheckCampaignStages(BaseModel):
stages: List[str]
class GoogleCheckLanguageMode(BaseModel):
language_mode: str
如果我运行
stages = parse_obj_as(List[GoogleCheckCampaignStages], data['stages'])
returns
value is not a valid dict (type=type_error.dict)
与 data['language_mode']
相同的结果。
如果我尝试使用 parse_raw_as()
方法
parse_raw_as(GoogleCheckLanguageMode, data['language_mode'])
returns
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
那么如何解析 str
和 list
值呢?
您遇到的错误是因为您传入的 data["stages"]
只是一个 list/array。它没有名为 stages
的密钥,因此 Pydantic 不知道如何分配它。
假设 NonEmptyString
定义如下,我建议创建一个模型来处理整个 data
对象,例如:
from pydantic import BaseModel, parse_obj_as, constr
from typing import List
NonEmptyString = constr(min_length=1)
class CampaignData(BaseModel):
title: NonEmptyString
geo_segment: NonEmptyString
# and so on ...
class Data(BaseModel):
campaigns: List[CampaignData]
stages: List[str]
language_mode: str
parsed_data = parse_obj_as(Data, data)
print(parsed_data)
# campaigns=[CampaignData(title='GBP', geo_segment='WW', ...)] stages=['pre', 'post'] language_mode='all_en'
如果您只想访问特定元素,您可以像这样轻松地做到这一点:
print(parsed_data.stages)
# ['pre', 'post']
输入以下数据
data = {
'campaigns': [
{
'title': 'GBP',
'geo_segment': 'WW',
'ac_type': 'Value',
'conversion': 'soft',
'asset_type': 'ALL',
'date': '22.04.21',
'name': 'GBP_WW_1_core_22.04.21',
'budget': '2000',
'cpa': '1,00'
}
],
'stages': [
'pre',
'post'
],
'language_mode': 'all_en'
}
为了解析campaigns
,我使用parse_obj()
方法
campaigns = parse_obj_as(List[CampaignData], data['campaigns'])
class CampaignData(BaseModel):
title: NonEmptyString
geo_segment: NonEmptyString
......
有效。
如何验证其余数据(stages
:List
,language_mode
:str
),这不是 dict
类型?
class GoogleCheckCampaignStages(BaseModel):
stages: List[str]
class GoogleCheckLanguageMode(BaseModel):
language_mode: str
如果我运行
stages = parse_obj_as(List[GoogleCheckCampaignStages], data['stages'])
returns
value is not a valid dict (type=type_error.dict)
与 data['language_mode']
相同的结果。
如果我尝试使用 parse_raw_as()
方法
parse_raw_as(GoogleCheckLanguageMode, data['language_mode'])
returns
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
那么如何解析 str
和 list
值呢?
您遇到的错误是因为您传入的 data["stages"]
只是一个 list/array。它没有名为 stages
的密钥,因此 Pydantic 不知道如何分配它。
假设 NonEmptyString
定义如下,我建议创建一个模型来处理整个 data
对象,例如:
from pydantic import BaseModel, parse_obj_as, constr
from typing import List
NonEmptyString = constr(min_length=1)
class CampaignData(BaseModel):
title: NonEmptyString
geo_segment: NonEmptyString
# and so on ...
class Data(BaseModel):
campaigns: List[CampaignData]
stages: List[str]
language_mode: str
parsed_data = parse_obj_as(Data, data)
print(parsed_data)
# campaigns=[CampaignData(title='GBP', geo_segment='WW', ...)] stages=['pre', 'post'] language_mode='all_en'
如果您只想访问特定元素,您可以像这样轻松地做到这一点:
print(parsed_data.stages)
# ['pre', 'post']